用户、群组及权限的深入讨论
使用passwd修改密码和检查用户密码的状态
- 使用passwd命令修改密码和查看密码状态
- 普通用户只能修改自己的密码
- Linux要求普通用户的密码必须足够安全
- root用户修改的密码可以不安全
- root用户可以修改其他用户的密码
- root用户可以查看其他用户的密码状态
- 使用带有-S或–status选项的passwd命令查看
groups ~ 确定dog用户所属的群组:
- id ~ 不但可以获取当前用户所属的群组、还可 以获取群组的ID以及用户ID和用户名:
- last ~ 列出户登录系统和重启Linux系统时间的历史记录
[root@dog ~]# groups
root bin daemon sys adm disk wheel
[root@dog ~]# id
uid=0(root) gid=0(root) groups=0(root),1(bin),
2(daemon),3(sys),4(adm), 6(disk),10(wheel)
[root@dog dag]# tail -5 /etc/shadow
sshd:!!:18345::::::
tcpdump:!!:18345::::::
dag:$6$PUSdiuHt7wLfIlMP$X2rBqYnUZmVybwza/SlYnUr65FlrKnhapP.E82Mckug3ev5h5KYZgjjSAn2MLOBMbchphg9cweLrgIGz83u3h0:18351:0:99999:7:::
cat:$6$x6UWHWRZ$VUbbK9Y7ReNsxFTvapo5jnjVkM6U0.yPeh17RLefpTO8jXAId1K7.bNFZvl3TiACLqW6XDFGDgrGP3JSfqsfb1:18395:0:99999:7:::
fox::18398:0:99999:7:::
[root@dog dag]# useradd pig
[root@dog dag]# tail -5 /etc/shadow
tcpdump:!!:18345::::::
dag:$6$PUSdiuHt7wLfIlMP$X2rBqYnUZmVybwza/SlYnUr65FlrKnhapP.E82Mckug3ev5h5KYZgjjSAn2MLOBMbchphg9cweLrgIGz83u3h0:18351:0:99999:7:::
cat:$6$x6UWHWRZ$VUbbK9Y7ReNsxFTvapo5jnjVkM6U0.yPeh17RLefpTO8jXAId1K7.bNFZvl3TiACLqW6XDFGDgrGP3JSfqsfb1:18395:0:99999:7:::
fox::18398:0:99999:7:::
pig:!!:18400:0:99999:7:::
[root@dog dag]# more /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologin
rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
saslauth:x:498:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
pulse:x:497:495:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
oprofile:x:16:16:Special user account to be used by OProfile:/home/oprofile:/sbi
n/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
--More--(90%)
[fox@dog dag]$ su root
密码:
[root@dog dag]# passwd fox
更改用户 fox 的密码 。
新的 密码:
无效的密码: 过于简单化/系统化
无效的密码: 过于简单
重新输入新的 密码:
passwd: 所有的身份验证令牌已经成功更新。
[root@dog dag]# su root
[root@dog dag]# su fox
[fox@dog dag]$ passwd -S dog
只有根用户才能进行此操作。
[fox@dog dag]$ su root
密码:
[root@dog dag]# passwd -S dag
dag PS 2020-03-29 0 99999 7 -1 (密码已设置,使用 SHA512 加密。)
[root@dog dag]# passwd -status dag
passwd:错误的参数 -status: 未知的选项
[root@dog dag]# passwd --status dag
dag PS 2020-03-29 0 99999 7 -1 (密码已设置,使用 SHA512 加密。)
[root@dog dag]# tail -4 /etc/shadow
dag:$6$PUSdiuHt7wLfIlMP$X2rBqYnUZmVybwza/SlYnUr65FlrKnhapP.E82Mckug3ev5h5KYZgjjSAn2MLOBMbchphg9cweLrgIGz83u3h0:18351:0:99999:7:::
cat:$6$x6UWHWRZ$VUbbK9Y7ReNsxFTvapo5jnjVkM6U0.yPeh17RLefpTO8jXAId1K7.bNFZvl3TiACLqW6XDFGDgrGP3JSfqsfb1:18395:0:99999:7:::
fox:$6$EavaIL5j$11WQ5u96OVKR8K/TKRNIkmlXHpc7/oD1VqkcRxYYx6O2Ciqgq97PSx3fFrmK19TtrVwcM.6LMS.HgcYrnf85c.:18400:0:99999:7:::
pig:!!:18400:0:99999:7:::
使用su命令进行用户的切换
- su - dog命令要重新设置环境变量
- 使用-在用户切换后系统重新启动login shell
- 即重新装入当前用户的环境变量
- su dog命令不重新设置环境变量
- su -和su - root命令都是切换到root用户
- 用su从root切换到普通用户时不需输入密码
[fox@dog ~]$ whoami
fox
[fox@dog ~]$ su dog
su: 用户dog 不存在
[fox@dog ~]$ su dag
密码:
[dag@dog fox]$ whoami
dag
[dag@dog fox]$ pwd
/home/fox
[dag@dog fox]$ echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/dag/bin
[dag@dog fox]$ exit
exit
[dag@dog fox]$ su - dag
密码:
[dag@dog ~]$ pwd
/home/dag
[dag@dog ~]$ echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/dag/bin
[dag@dog ~]$ su root
密码:
[root@dog dag]# whoami
root
[root@dog dag]# pwd
/home/dag
[root@dog dag]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/dag/bin
[root@dog dag]# exit
exit
[dag@dog ~]$ su - root
密码:
[root@dog ~]# whoami
root
[root@dog ~]# pwd
/root
[root@dog ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@dog ~]# exit
logout
[dag@dog ~]$ su -
密码:
[root@dog ~]# whoami
root
[root@dog ~]# pwd
/root
[root@dog ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@dog ~]# su - cat
[cat@dog ~]$ whoami
cat
[cat@dog ~]$ pwd
/home/cat
[cat@dog ~]$ echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/cat/bin
发现与用户相关信息的命令
- [dog@dog ~]$、 [root@dog ~]#:
- $符号表示当前用户是一个普通用户
- #号表示当前用户是root超级用户
- @之前的dog和root为用户名
- @之后的dog为主机名(没有包括域名)
- ~表示当前用户的家目录
groups ~ 确定dog用户所属的群组:
- id ~ 不但可以获取当前用户所属的群组、还可 以获取群组的ID以及用户ID和用户名:
- last ~ 列出户登录系统和重启Linux系统时间的历史记录
[dag@dog ~]$ whoami
dag
[dag@dog ~]$ groups
dag
[dag@dog ~]$ id
uid=500(dag) gid=500(dag) 组=500(dag) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[dag@dog ~]$ su root
密码:
[root@dog dag]# su - root
[root@dog ~]# groups
root
[root@dog ~]# id
uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@dog ~]# su - fox
[fox@dog ~]$ whoami
fox
[fox@dog ~]$ su - pig
密码:
su: 密码不正确
[fox@dog ~]$
[fox@dog ~]$ su - pig
密码:
su: 密码不正确
[fox@dog ~]$
[fox@dog ~]$ su - pig
密码:
su: 密码不正确
[fox@dog ~]$ su - root
密码:
[root@dog ~]# su - pig
[pig@dog ~]$ whoami
pig
[pig@dog ~]$ su - dag
密码:
[dag@dog ~]$ users
dag dag
[dag@dog ~]$ who
dag tty1 2020-05-17 22:52 (:0)
dag pts/0 2020-05-17 22:52 (:0.0)
[dag@dog ~]$ w
23:44:55 up 53 min, 2 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
dag tty1 :0 22:52 54:12 12.05s 0.16s pam: gdm-passwo
dag pts/0 :0.0 22:52 0.00s 0.17s 0.08s w
Linux系统的默认权限设定
-
文件系统的默认权限是666——rw-rw-rw-
-
目录系统的默认权限是777——rwxrwxrwx
-
以上并不是最终的文件和目录的权限
-
要经过掩码挡掉某些不需要的默认权限才能最后产生用户所需的文件和目录的最终权限
-
普通用户的默认掩码(umask)为002
-
root用户的默认掩码(umask)为022
-
使用umask命令来确定当前用户目前的掩码
-
文件系统默认权限是666
-
普通用户默认掩码为002、经过掩码遮挡后other的写权限被遮挡掉,最终文件的权限为664
-
root默认掩码为022、经过掩码遮挡后group和other的写权限都遮挡掉、最终这个文件的权限是644
-
文件系统默认权限为666而这回umask为033
-
当666与033相减之后所得的结果为633
-
而该文件的最后权限应该是644
[dag@dog ~]$ umask
0002
[dag@dog ~]$ su -
密码:
[root@dog ~]# umask
0022
[root@dog ~]# cd babydog
-bash: cd: babydog: 没有那个文件或目录
[root@dog ~]# exit
logout
[dag@dog ~]$ cd babydog
[dag@dog babydog]$ umask
0002
[dag@dog babydog]$ umask 033
[dag@dog babydog]$ umask
0033
[dag@dog babydog]$ touch dog_wolf.baby
[dag@dog babydog]$ ls -l do*
-rw-r--r--. 1 dag dag 0 5月 18 00:20 dog_wolf.baby
[dag@dog babydog]$ umask 077
[dag@dog babydog]$ umask
0077
[dag@dog babydog]$ touch wolf_dog.baby
[dag@dog babydog]$ umask
0077
[dag@dog babydog]$ ls -l w*
-rw-------. 1 dag dag 0 5月 18 00:23 wolf_dog.baby
特殊权限(第4组权限)
- 特殊权限分为suid、sgid和sticky 3种权限
- suid借用用户权限中最后一位,即可执行权限位并以s表示
- sgid借用群组权限的最后一位并以s表示
- sticky借用其他用户权限中最后一位并以t表示
添加suid特殊权限例子
- 有一文件,其所有用户都有执行权限、而有一目录,其所有用户都没有执行权限
- 如果要在该文件上加入suid特殊权限,因为文件的所有者本来有执行权限,所以Linux系统就会使用小写的s替换这一位的x
添加suid特殊权限例子
- 有一文件,其所有用户都有执行权限、而有一目录,其所有用户都没有执行权限
- 如果要在该文件上加入suid特殊权限,因为文件的所有者本来有执行权限,所以Linux系统就会使用小写的s替换这一位的x
添加sgid特殊权限的例子
- 如果在这个文件上加入sgid特殊权限,因为文件的同一群组本来就有执行权限,所以Linux会使用小写的s替换这一位的x
- 如果在这个目录上加入sgid特殊权限,因为目录的同一群组本身没有执行权限,所以Linux会使用大写的S替换这一位的x
添加sticky特殊权限的例子
- 如果在该文件上加入sticky特殊权限,因为文件的其他用户本来就有执行权限,所以Linux会使用小写的t替换这一位的x
- 如果在该目录上加入sticky特殊权限,因为目录的其他用户本身没有执行权限,所以Linux会使用大写的T替换这一位的x
以chmod的字符方式设置特殊(第4组)权限
[dog@dog babydog]$ ls -l dog.baby wolf.baby
-rwxr-xr-x 1 dog dog 0 Jan 13 03:29 dog.baby
-rwxr-xr-- 1 dog dog 0 Jan 13 03:29 wolf.baby
[dog@dog babydog]$ chmod u+s dog.baby
[dog@dog babydog]$ ls -l dog.baby wolf.baby
-rwsr-xr-x 1 dog dog 0 Jan 13 03:29 dog.baby
-rwxr-xr-- 1 dog dog 0 Jan 13 03:29 wolf.baby
[dag@dog babydog]$ clear
[dag@dog babydog]$ cd babydog
-bash: cd: babydog: 没有那个文件或目录
[dag@dog babydog]$
[dag@dog babydog]$ touch {dog,wolf}.baby
[dag@dog babydog]$ ls -l *baby
-rw-------. 1 dag dag 0 5月 18 00:39 dog.baby
-rw-r--r--. 1 dag dag 0 5月 18 00:20 dog_wolf.baby
-rw-------. 1 dag dag 0 5月 18 00:39 wolf.baby
-rw-------. 1 dag dag 0 5月 18 00:23 wolf_dog.baby
[dag@dog babydog]$ chmod 755 dog.baby
[dag@dog babydog]$ chmod 754 wolf.baby
[dag@dog babydog]$ ls -l dog.baby wolf.baby
-rwxr-xr-x. 1 dag dag 0 5月 18 00:39 dog.baby
-rwxr-xr--. 1 dag dag 0 5月 18 00:39 wolf.baby
[dag@dog babydog]$ chmod u+s dog.baby
[dag@dog babydog]$ ls -l dog.baby wolf.baby
-rwsr-xr-x. 1 dag dag 0 5月 18 00:39 dog.baby
-rwxr-xr--. 1 dag dag 0 5月 18 00:39 wolf.baby
[dag@dog babydog]$ chmod g+s wolf.baby
[dag@dog babydog]$ ls -l dog.baby wolf.baby
-rwsr-xr-x. 1 dag dag 0 5月 18 00:39 dog.baby
-rwxr-sr--. 1 dag dag 0 5月 18 00:39 wolf.baby
[dag@dog babydog]$ chomd o+t dog.baby
-bash: chomd: command not found
[dag@dog babydog]$ chmod o+t dog.baby
[dag@dog babydog]$ ls -l dog.baby wolf.baby
-rwsr-xr-t. 1 dag dag 0 5月 18 00:39 dog.baby
-rwxr-sr--. 1 dag dag 0 5月 18 00:39 wolf.baby
[dag@dog babydog]$ chmod o+t wolf.baby
[dag@dog babydog]$ ls -l dog.baby wolf.baby
-rwsr-xr-t. 1 dag dag 0 5月 18 00:39 dog.baby
-rwxr-sr-T. 1 dag dag 0 5月 18 00:39 wolf.baby
以chmod的数字方式设定特殊权限
在第4组权限中,suid使用八进制的4(二进制的100)来表示,sgid使用八进制的2(二进制的10)来表示,而sticky使用八进制的1(二进制的1)来表示,如图
suid sgid sticky
(4) (2) (1)
[dag@dog babydog]$ chmod 755 dog.baby
[dag@dog babydog]$ ls -l dog.baby wolf.baby
-rwxr-xr-x. 1 dag dag 0 5月 18 00:39 dog.baby
-rwxr-sr-T. 1 dag dag 0 5月 18 00:39 wolf.baby
[dag@dog babydog]$ chomd 754 wolf.baby
-bash: chomd: command not found
[dag@dog babydog]$ chmod 754 wolf.baby
[dag@dog babydog]$ ls -l dog.baby wolf.baby
-rwxr-xr-x. 1 dag dag 0 5月 18 00:39 dog.baby
-rwxr-xr--. 1 dag dag 0 5月 18 00:39 wolf.baby
#在dog.baby文件上加入suid和sticky特殊权限,由上图可知这两个权限的数字为5(4+1),
[dag@dog babydog]$ chmod 5755 dog.baby
[dag@dog babydog]$ ls -l dog.baby wolf.baby
-rwsr-xr-t. 1 dag dag 0 5月 18 00:39 dog.baby
-rwxr-xr--. 1 dag dag 0 5月 18 00:39 wolf.baby
#在wolf.baby文件上加上所有权限 数字为7(4+2+1)
[dag@dog babydog]$ chmod 7754 wolf.baby
[dag@dog babydog]$ ls -l dog.baby wolf.baby
-rwsr-xr-t. 1 dag dag 0 5月 18 00:39 dog.baby
-rwsr-sr-T. 1 dag dag 0 5月 18 00:39 wolf.baby
特殊权限对可执行文件的作用
- 将suid和sgid特殊权限设定在可执行文件上所具有的特性如下:
- suid将以可执行文件所有者权限来运行这一命令、而不是以执行者的权限来运行该命令
- sgid特殊权限与suid类似,是以可执行文件的群组的权限运行这一命令(可执行文件)的
- 普通用户之所以可以执行ping命令是因为在ping可执行文件上设置了suid特殊权限
[root@dog ~]# ls -l /bin/ping
-rwsr-xr-x 1 root root 33272 Oct 7 2006 /bin/ping
ping命令的工作原理
- ping是使用ICMP网络协议
- Linux内核中设定只有root才有权限控制ICMP封包
- 为了使其他用户有权使用ping,必须在ping可执行文件上设置suid权限而其他用户都有执行权限、并且ping的所有者为root用户
[dag@dog babydog]$ chmod 755 dog.baby
[dag@dog babydog]$ ls -l dog.baby wolf.baby
-rwxr-xr-x. 1 dag dag 0 5月 18 00:39 dog.baby
-rwxr-sr-T. 1 dag dag 0 5月 18 00:39 wolf.baby
[dag@dog babydog]$ chomd 754 wolf.baby
-bash: chomd: command not found
[dag@dog babydog]$ chmod 754 wolf.baby
[dag@dog babydog]$ ls -l dog.baby wolf.baby
-rwxr-xr-x. 1 dag dag 0 5月 18 00:39 dog.baby
-rwxr-xr--. 1 dag dag 0 5月 18 00:39 wolf.baby
[dag@dog babydog]$ chmod 5755 dog.baby
[dag@dog babydog]$ ls -l dog.baby wolf.baby
-rwsr-xr-t. 1 dag dag 0 5月 18 00:39 dog.baby
-rwxr-xr--. 1 dag dag 0 5月 18 00:39 wolf.baby
[dag@dog babydog]$ chmod 7754 wolf.baby
[dag@dog babydog]$ ls -l dog.baby wolf.baby
-rwsr-xr-t. 1 dag dag 0 5月 18 00:39 dog.baby
-rwsr-sr-T. 1 dag dag 0 5月 18 00:39 wolf.baby
[dag@dog babydog]$ su -root
su:无效选项 -- r
请尝试执行"su --help"来获取更多信息。
[dag@dog babydog]$ su - root
密码:
[root@dog ~]# ls -l /bin/ping
-rwsr-xr-x. 1 root root 38520 1月 11 2017 /bin/ping
[root@dog ~]# su - dog
su: 用户dog 不存在
[root@dog ~]# su - dag
[dag@dog ~]$ ping 192.168.43.16
PING 192.168.43.16 (192.168.43.16) 56(84) bytes of data.
64 bytes from 192.168.43.16: icmp_seq=1 ttl=128 time=1.29 ms
64 bytes from 192.168.43.16: icmp_seq=2 ttl=128 time=1.93 ms
64 bytes from 192.168.43.16: icmp_seq=3 ttl=128 time=1.65 ms
64 bytes from 192.168.43.16: icmp_seq=4 ttl=128 time=1.66 ms
64 bytes from 192.168.43.16: icmp_seq=5 ttl=128 time=1.71 ms
64 bytes from 192.168.43.16: icmp_seq=6 ttl=128 time=1.79 ms
64 bytes from 192.168.43.16: icmp_seq=7 ttl=128 time=1.80 ms
64 bytes from 192.168.43.16: icmp_seq=8 ttl=128 time=1.64 ms
^Z
[1]+ Stopped ping 192.168.43.16
[dag@dog ~]$ chmod u-s /bin/ping
chmod: 更改"/bin/ping" 的权限: 不允许的操作
[dag@dog ~]$ su - root
密码:
[root@dog ~]# chmod u-s /bin/ping
[root@dog ~]# ls -l /bin/ping
-rwxr-xr-x. 1 root root 38520 1月 11 2017 /bin/ping
[root@dog ~]# su dag
[dag@dog root]$ exit
exit
[root@dog ~]# su - root
[root@dog ~]# su - dag
[dag@dog ~]$ ping 192.168.43.16
ping: icmp open socket: 不允许的操作
[dag@dog ~]$ chmod u+s /bin/ping
chmod: 更改"/bin/ping" 的权限: 不允许的操作
[dag@dog ~]$ su - root
密码:
[root@dog ~]# chmod u+s /bin/ping
[root@dog ~]# ls -l /bin/ping
-rwsr-xr-x. 1 root root 38520 1月 11 2017 /bin/ping
[root@dog ~]# su - dag
[dag@dog ~]$ ping 192.168.43.16
PING 192.168.43.16 (192.168.43.16) 56(84) bytes of data.
64 bytes from 192.168.43.16: icmp_seq=1 ttl=128 time=1.09 ms
64 bytes from 192.168.43.16: icmp_seq=2 ttl=128 time=1.68 ms
^Z
[1]+ Stopped ping 192.168.43.16
特殊权限目录的作用
- 将sticky和sgid特殊权限设定在目录上所具有的特性如下:
- 如果在一个目录上设置了sticky特殊权限,只有文件的所有者和root用户才可以删除该目录中的文件,而Linux不会理会group或other的写权限
- 如果在一个目录上设置了sgid特殊权限,只要是同一群组的成员,都可以在这个目录中创建文件
- 通常会对目录同时设置sticky和sgid这两个特殊权限以方便项目的管理