Linux账号与用户组

UID和GID

总之就是非常重要,不要乱改/etc/passwd下的东西

用户账号

登陆时OS做了什么

  • 在/etc/passwd中查询是否有该用户名,若有,读出UID和GID
  • 在/etc/shadow中查询账号和UID,然后确认密码

所以要保护好上述内容的权限

/etc/passwd的文件结构

每行一个账号,以冒号分割

root:x:0:0:root:/root:/bin/bash

按顺序分别为

  • 账号名
  • 密码(woc),早期的密码是放在这的,后来移动到/etc/shadow上了
  • UID
  • GID
  • 用户信息说明,说明这个账号是干啥的
  • 家目录
  • 使用的shell

/etc/shadow的文件结构

root:!:19032:0:99999:7:::
daemon:*:18480:0:99999:7:::
bin:*:18480:0:99999:7:::

同上,按顺序

  • 账号名称
  • 密码
  • 最近修改密码的日期,单位是天,指到1970年1月1号的天数。
  • 密码不可被修改的天数(与第三个字段相比较)
  • 密码需要被修改的天数(与第三个字段相比较)
  • 密码需要被修改的期限前的警告天数(与第五个字段比较)
  • 密码过期后强制修改的天数(与第五个字段比较)
  • 保留字段

关于shadow,注意要保持其权限为600。

关于shadow的加密方式,根据linux distribution版本不同而不懂,可以使用authconfig --test | grep hashing查看。(好像这个指令太老了?)

用户组

/etc/group的文件结构

格式同/etc/passwd,按顺序:

  • 组名
  • 用户组密码
  • GID
  • 此用户组支持的账号名称

初始用户组与有效用户组

/etc/passwd中记录的GID为初始用户组,用户一登陆就拥有该用户组的所有权限。

/etc/group中记录了某用户后,该用户也支持该用户组。

  • 使用groups查看当前用户支持的所用用户组,显示的第一个用户组为当前的有效用户组
  • 使用newgrp切换有效用户组。注意,该指令使用一个新的shell来切换有效用户组,因此要使用exit来退出而不是直接切换回去。

/etc/gshadow的文件结构

格式同上,按顺序:

  • 组名
  • 密码栏,!表示无合法密码(即无用户组管理员)
  • 用户组管理员的账号
  • 加入该用户组支持的所属账号

账号管理

新增和删除用户

useradd

useradd [-u UID] [-g initial group] [-G other group] name
参数 含义
-u UID
-g 初始用户组
-G 次要用户组
-M 强制不要建立用户家目录
-m 强制要建立用户家目录
-c 用户说明
-d 试某个目录成为家目录,注意,务必要使用绝对路径
-r 建立系统账号,即UID小于1000
-s 指定使用的shell
-e 设定账号失效日期
-f 指定密码是否会失效

使用useradd时,linux会做以下内容

  • 向/etc/passwd中写入一行与账号相关的信息
  • 向/etc/shadow中写入此账号的密码相关信息,但还没有真的密码
  • 向/etc/group中写入一个默认的组名
  • 在/home下建立默认的家目录、

使用useradd -D查看其默认值,其内容来源于/etc/default/useradd

GROUP=100 # 默认GID
HOME=/home # 默认家目录
INACTIVE=-1 # 密码失效日期
EXPIRE= # 账号失效日期
SHELL=/bin/sh # 默认的shell
SKEL=/etc/skel # 用户家目录内容的参考数据
CREATE_MAIL_SPOOL=no # 是否主动帮用户建立邮箱

除此之外,UID/GID的密码参数在/etc/login.defs文件(下面这个是筛选过的)

MAIL_DIR        /var/mail # 默认邮箱目录
FAILLOG_ENAB            yes
LOG_UNKFAIL_ENAB        no
LOG_OK_LOGINS           no
SYSLOG_SU_ENAB          yes
SYSLOG_SG_ENAB          yes
FTMP_FILE       /var/log/btmp
SU_NAME         su
HUSHLOGIN_FILE  .hushlogin
ENV_SUPATH      PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ENV_PATH        PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
TTYGROUP        tty
TTYPERM         0600
ERASECHAR       0177
KILLCHAR        025
UMASK           02 # 用户的umask
PASS_MAX_DAYS   99999 # 多久需要修改密码
PASS_MIN_DAYS   0 # 多久不可重设密码
PASS_WARN_AGE   7 # 密码过期警告日期
UID_MIN                  1000 # 用户可以使用的最小UID
UID_MAX                 60000 # 最大UID
GID_MIN                  1000 # 用户可以使用的最小GID
GID_MAX                 60000 # 最大GID
#SYS_GID_MIN              100 # 系统账号保留的最小UID
#SYS_GID_MAX              999 # 系统账号的最大UID
LOGIN_RETRIES           5
LOGIN_TIMEOUT           60
CHFN_RESTRICT           rwh
DEFAULT_HOME    yes # 默认是否为用户创建家目录
USERGROUPS_ENAB yes # 使用userdel删除用户时,是否删除初始用户组
ENCRYPT_METHOD SHA512 # 密码的加密机制

passwd

刚建好的账号是锁定的,得设置密码

passwd [] username
参数 含义
–stdin 接收前一个pipe的数据
-l lock,使密码失效
-u unlock
-S 列出密码相关的信息,主要是展示/etc/shadows中的内容
-n 多久不可修改密码的天数
-x 多久必须修改密码
-w 密码过期前的警告天数
-i 密码失效日期

chage

高级一点的passwd

chage [-option] username
参数 选项
-l 列出详细信息
-d 修改shadow第三栏位,最近一次修改日期的时间
-m 第四栏位,密码保留天数
-M 第五栏位,密码多久需要修改
-W 第六栏位,密码过期前警告
-I 第七栏位,密码失效日期
-E 第八栏位,账号失效日期

usermod

修改用户设置

userdel

删除用户,包括以下数据

  • /etc/passwd,/etc/shadow
  • /etc/group,/etc/gshadow
  • /home/username,/var/spool/mail/username
userdel [-r] username
# -r 表示将家目录也删除

用户功能

id

查询自己(或别人)的uid等基本信息

finger

查看更多信息(默认不安装)

chfg

change finger,感觉用不上

chsh

change shell

chsh -l # 列出可用的shell
chsh -s # 设置shell

新增和删除用户组

groupadd

groupadd [-g gid] [-r] groupname
# -r 建立系统用户组

groupmod

groupmod [-g gid] [-n group_name] groupname
# -n 用来修改现有的用户组名

groupdel

groupdel [groupname]

若有用户使用某个用户组作为初始用户组,则该用户组无法删除。此时可以

  • 修改用户的GID
  • 删除该用户

gpasswd

建立group管理员

# root的使用
gpasswd groupname # 设置group密码
gpasswd -A user groupname # 指定group的用户管理员
gpasswd -M user groupname # 将用户加入group
# -r 使group密码失效
# -R 使group密码栏失效

# 用户组管理员的使用
gpasswd -a user # 添加用户
gpasswd -d user # 删除用户

ACL的使用

authconfig和authconfig-tui可用于外部身份认证

ACL介绍

Access Control List

ACL可针对的方面

  • user
  • group
  • mask(默认属性)

ACL的设置

setfacl

用于设置某个文件/目录的ACL权限

setfacl [bkRd] [{-m|-x} acl argument] filename
# ACL参数格式
u:user:[rwx] # 对特定user
g:group:[rwx] # 对特定group
m:[rwx] # 对mask(有效权限)
d:[ug]:[rwx] #默认权限
参数 含义
-m 设置后续的ACL参数
-x 删除后续的ACL参数,删除时用-来占位
-b 删除所有的ACL参数,删除时用-来占位
-k 删除默认的ACL参数
-R 递归
-d 设置默认的ACL参数(只对目录有效)

getfacl

用于查看某个文件/目录的ACL权限

getfacl filename

用户身份切换

su

su [-lm] [-c command] [username]
# - 使用login-shell方式登录
# -l 同上,但后面必须加username
# 不加-就是nologin-shell登录
# -m 和 -p表示“使用目前的环境变量设置,而不读取新使用者的配置为文件
# -c 只执行一次command

注:那个-很重要

sudo

/etc/sudoers内记录

sudo [-b] [-u username]
# -b background,将命令放到后台进行
# -u 后面接欲切换的用户,默认为root

sudo的执行流程

  • 系统查看/etc/sudoers文件中该用户是否有sudo权限
  • 让用户输入自己的密码,若自己就是要切换的用户,则不必输入密码。root使用sudo也不需要输入密码
  • 执行命令

修改/etc/sudoers

该文件具有一定规范,因此更推荐使用visudo去修改(怎么觉得没啥区别?)

root	ALL=(ALL)	ALL # username	login_host_name=(user_available)  command_available
%wheel	ALL=(ALL)	ALL # % represent group
%wheel	ALL=(ALL)	NOPASSWD: ALL # 免密
user1	ALL=(root)	!/usr/bin/psswd, /usr/bin/passwd [A-za-z]*, !/usr/bin/passwd root #!表示不可执行,这样就可以修改别的用户的密码,但不能修改root的
User_Alias ADMPW = pro1,pro2,pro3 # 别名建立新账号,注意该账号必须是大写
Cmnd_Alias ADMPWCOM = !/usr/bin/passwd,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root
ADMPW	ALL=(root)	ADMPWCOM

关于切换到root用户的方法

以前的我:su。这样是使用nologin shell的变量文件登录的root

那是不是应该su -,这样就完整的读取了root的login shell配置文件

如果我只执行一条命令的话,那就是su - -c command

不过这样还要输入root的密码,要是没有root密码呢?

sudo咯,这样也是每条指令前都要加sudo

鸟哥还教了一个方法,在/etc/sudoers中这样写

User_Alias ADMINS = user1,user2
ADMINS	ALL=(root)	/bin/su -
# 然后就可以这样登录root了
sudo su -

不过现在的主流方式好像是sudo -i

man page的说法是,这样相当于登录的root的login shell,读取了它的所有环境变量,并以一个interactive shell的形式呈现,还帮忙把用户切换到家目录里去了。

这应该是sudo提供的一个“装的很像”的切换方式,既然装的这么像,那还是用它。

PAM模块

Pluggable Authentication Modules

是个linux内置的api,返回的结果要么成功要么失败。

是个很nb的功能。跳了,暂时用不上,但迟早要用上,一定要记得回来看

//todo

linux主机上信息的传递

查询用户

w

用的多,略

who

有w了,懒得用

last

最近的登录记录

lastlog

各个用户的最近登录记录

用户交流

write

write username [terminal]

就硬发,打断你也要发

mesg

可使用mesg n强制闭上鼻子不听别人发(但阻止不了root)

mesg y再打开

wall

发给所有人

用户邮箱

再次提醒:/var/spool/mail

mail

mail -s "title" user
# 然后这里输入 . 来表示结束(我猜ctrl+d的EOF也可以)
# 也可以用stdin重定向进来
mail # 进入交互界面,查看邮件
& #<== 这是个提示符,示意你输命令
命令 含义
? ?
h 列出邮件标头,h 40
d 删除,d10,d20-40
s 存储邮件内容,s 5 ~/mail.file
x 不做任何事直接退出
q 保存后退出

创建大量账号

高级话题,稍微看看

pwck

用于检查/etc/passwd中的信息是否正确

grpck

检查用户组

pwconv

将/etc/passwd中的账号和密码移动到/etc/shadow中,如果用useradd之类的话,是没它什么事的

pwunconv

将/etc/shadow写入/etc/passwd,然后删除/etc/shadow(危?)

chpasswd

读入未加密的密码,加密后写入/etc/shadown中,示例:echo "user1:abcdefg" | chpasswd

一个大量创建账号的模板

用不到的样子