第一字段:用户名称
第二字段:密码标志
第三字段:UID(用户ID)
0: 超级用户
1-499: 系统用户(伪用户)
500-65535: 普通用户
第四字段:GID(用户初始组ID)
第五字段:用户说明
第六字段:家目录
普通用户:/home/用户名/
超级用户:/root/
第七字段:登录之后的Shell
初始组:指用户一登录就立刻拥有这个用户组相关的权限,每个用户的初始组只能有一个,一般是将用户名相同的组名作为初始组。
附加组:指用户可以加入多个其他的用户组,并拥有这些组的权限,附加组可以有多个。
可以使用 vim /etc/shadow查看
第一字段:用户名称
第二字段:加密密码
如果密码位是“!!”或“*”,代表没有密码。不能登录
第三字段:密码最后一次修改日期
使用1970年1月1日最为标准时间,每过一天加时间戳1
第四字段:两次密码的修改时间间隔(与第三字段相比)
第五字段:密码有效期(与第三字段相比)
第六字段:密码到期前的警告天数(和第五字段相比)
第七字段:密码过期后的宽限天数(和第五字段相比)
0:代表密码过期后立即失效
-1:代表密码永远不会失效
第八字段:账号失效时间
用时间戳表示
第九字段:保留字段
把时间戳换算为日期:date -d "1970-01-01 17056 days"
把日期换算为时间戳:echo ( ( ((date -date=“2017/02/06”+%s)/86400+1)
第一字段:组名
第二字段:组密码标志
第三字段:GID
第四字段:组中附加用户
第一字段:组名
第二字段:组密码
第三字段:组管理员用户名
第四字段:组中附加用户
普通用户:/home/用户名/,所有者和所属组都是此用户,权限是700
超级用户:/root/,所有者和所属组都是root用户,权限是550
/var/spool/mail/用户名/
/etc/skel/
语法:useradd [选项] 用户名
选项:
-u (UID) | 手工指定用户的UID号 |
---|---|
-d (家目录) | 手工指定用户的家目录 |
-c (用户说明) | 手工指定用户的说明 |
-g (组名) | 手工指定用户的初始组 |
-G (组名) | 指定用户的附加组 |
-s (shell) | 手工指定用户的登录shell,默认是/bin/bash |
语法:passwd [选项] 用户名
选项:
-S | 查询用户密码的密码状态。仅root用户可用 |
---|---|
-l | 暂时锁定用户。仅root用户可用 |
-u | 解锁用户。仅root用户可用 |
–stdin | 可以通过管道符输出的数据作为用户的密码 |
语法:usermod [选项] 用户名
选项:
-u UID | 修改用户名的UID号 |
---|---|
-c 用户数说明 | 修改用户的说明信息 |
-G 组名 | 修改用户的附加组 |
-L | 临时锁定用户(Lock) |
-U | 解锁用户锁定(Unlock) |
示列:
usermod -c ‘test user’ zhangsan #修改用户的说明
usermod -G root zhangsan #把zhangsan用户加入root 组
usermod -L zhangsan #锁定用户
usermod -U zhangsan #解锁用户
语法:change [选项] 用户名
选项:
-l | 列出用户的详细密码状态 |
---|---|
-d 日期 | 修改密码最后一次更改日期 (shadow3字段) |
-m 天数 | 两次密码修改间隔(4字段) |
-M 天数 | 密码有效期(5字段) |
-W 天数 | 密码过期前警告天数(6字段) |
-I 天数 | 密码过后宽限天数 (7字段) |
-E 日期 | 账号失效时间(8字段) |
语法:userdel [-r] 用户名
选项:
-r 删除用户的同时删除用户家目录
手工删除用户的命令:
vi /etc/passwd
vi /etc/shadow
vi /etc/group
vi /etc/gshadow
rm -rf /var/spool/mail/zhangsan
rm -rf /home/zhangsan/
语法:id 用户名
语法:su [选项] 用户名
选项:
- | 选项只使用“-”代表连带用户的环境变量一起切换 |
---|---|
-c命令 | 仅执行一次命令,而不切换用户身份 |
语法:groupadd [选项] 组名
选项:
-g GID: 指定组ID
语法:groupmod [选项] 组名
选项:
-g GID | 修改组ID |
---|---|
-n 新组名 | 修改组名 |
示列:groupmod -n testgrp group1 #把组名group1修改为testgrp
语法:groupdel 组名
语法:gpasswd 选项 组名
选项:
-a 用户名 | 把用户加入组 |
---|---|
-d 用户名 | 把用户从组中 |
语法:dumpe2fs -h /dev/sda3
#dumpe2fs命令是查询指定分区详细文件系统信息的命令
选项:
-h 仅显示超级块中信息,而不是显示磁盘块组的详细信息
语法:mount -o remount,acl / #重新挂载根分区,并挂载加入acl权限
语法:vi /etc/fstab #加入acl
mount -o remount / #重新挂载文件系统或启动系统,使修改生效
语法:getfacle 文件名 #查看acl权限
语法:setfacl 选项 文件名
-m | 设定ACL权限 |
---|---|
-x | 删除指定的ACL权限 |
-b | 删除所有的ACL权限 |
-d | 设定默认ACL权限 |
-k | 删除默认ACL权限 |
-R | 递归设定ACL权限 |
用法:useradd zhangsan
useradd st
groupadd tgroup
mkdir /project
chown root:tgroup /project/
chmod 770 /project/
setfacl -m u:st:rx /project/
#给用户st赋予r-x权限,使用“u:用户名:权限” 格式
用法:groupadd tgroup2
sefacl -m g:tgroup2:rwx project/ #为组group2分配ACL权限,使用“g:组名:权限”格式
语法:setfacl -m m:rx 文件名 #设定mask权限为r-x 。使用“m:权限”格式
语法:setfacl -x u:用户名 文件名 #删除指定用户的ACL权限
setfacl -x g:组名 文件名 #删除指定用户组的ACL权限
setfacl -b 文件名 #删除文件的所有ACL权限
默认ACL权限的作用是如果给夫目录设定了默认ACL权限,那么父目录中所有新建的子文件都会继承父目录的ACL权限。
setfacl -m d:u:用户名:权限 文件名
递归是父目录在设定ACL权限时,所有的子文件和子目录也会拥有相同的ACL权限。
setfacl -m u:用户名:权限 -R 文件名
1、只有可执行的二进制程序才能设定SUID权限
2、命令执行者要对该程序拥有x(执行)权限
3、命令执行者在执行该程序是获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属主)
4、SetUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效
passwd命令拥有SetUID权限,所以普通用户可以修改自己的密码
示列:ll /usr/bin/passwd #-rwsr-xr-x root root /usrbin/passwd
cat 命令没有SetUID权限,所以普通用户不能查看/etc/shadow文件内容
示列:ll /bin/cat #-rwxr-xr-x root root /bin/cat
4代表SUID
chmod 4755 文件名
chmod u+s 文件名
chmod 755 文件名
chmod u-s 文件名
关键目录应严格控制写权限。比如“/”、“/usr”等
用户的密码设置要严格遵守密码三原则
对系统中默认应该具有SetUID权限的文件作一列表,定时检测有没有这之外的文件被设置了SetUID权限
1、只有可执行的二进制程序才能设置SGID权限
2、命令执行者要对改程序用于x(执行)权限
3、命令执行在执行程序的时候,组身份升级为该程序文件的属组
4、SetGID权限同样只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效
1、普通用户必须对此目录拥有r和x权限,才能进入此目录
2、普通用户在此目录中的有效组会变成此目录的属组
3、若普通用户对此目录拥有w权限时,新建的文件的默认属组是这个目录的属组
用法示列:
ll usr/bin/locate #-rwx–s--x root slocate /usr/bin/locate
ll /var/lib/mlocate/mlocate.db #-rw-r----- root slocate /var/lib/mlocate/mlocate.db
4、/usr/bin/locate是可执行二进制程序,可以赋予SGID
5、执行用户lamp对/usr/bin/locate命令拥有执行权限
6、执行/usr/bin/locate命令时,组身份会升级为slocate组,而slocate组队/var/lib/mlocate/mlocate.db数据库拥有r权限,所以普通用户可以使用locate命令查询mlocate.db数据库
7、命令结束,sun用户的组身份返回为sun组
示列:
cd /tmp/ => mkdir test => chmod g+s test => ll -d test/ =>chmod 777 test/ =>su - sun =>
cd /tmp/test/ =>cd /tmp/test/ => touch abc => ll
2代表SGID
chmod 2755 文件名
chmod g+s 文件名
1、粘着位目前只对目录有效
2、普通用户对该目录拥有w和x权限,即普通用户可以在此目录拥有写入权限
3、如果没有粘着位,因为普通用户拥有w权限,所以可以删除此目录下所有文件,包括其他用户建立的文件。一旦赋予粘着位,除了root可以删除所有文件,普通用户就算拥有w权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件
1、设置粘着位
chmod 1755 目录名
chmod o+t 目录名
2、取消粘着位
chmod 777 目录名
chmod o-t 目录名
语法:chattr [±=] [选项] 文件或目录名
+: 增加权限
-: 删除权限
=: 等于某权限
选项:
i | 如果对文件设置i属性,那么不允许对文件进行删除、改名,也不能添加和修改数据;如果对目录设置i属性,那么只能修改目录下文件的数据,但不允许建立和删除文件 |
---|---|
a | 如果对文件设置a属性,那么只能在文件中增加数据,但是不能删除也不能修改数据;如果对目录设置a属性,那么只允许在目录中建立和修改文件,但是不允许删除 |
语法:lsattr 选项 文件名
选项:
-a | 显示所有文件和目录 |
---|---|
-d | 若目标是目录,仅列出目录本身的属性,而不是子文件的 |
1、root把本来只能超级用户执行的命令赋予普通用户执行
2、sudo的操作对象是系统命令
用法: visudo #实际修改的是/etc/sudoers/文件
root ALL=(ALL) ALL
#用户名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
#%wheel ALL=(ALL) ALL
#%组名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
语法:visudo
sun ALL=/sbin/shutdown -r now
语法:su - sun
sudo -l #查看可用的sudo 命令
sudo /sbin/shutdown -r now #普通用户执行sudo赋予的命令|