用户身份与文件权限
1.用户身份与能力
1.1useradd 命令
useradd命令用于创建新的用户,格式为“ useradd [选项 ] 用户名”。
可以使用useradd命令创建用户账户。使用该命令创建用户账户时,默认的用户家目录会被存放在 /home目录中,默认的 Shell解释器为 /bin/bash,而且默认会创建一个与该用户同名的基本用户组
注意 /sbin/nologin,它是终端解释器中的一员,与 Bash解释器有着天壤之别。一旦用户的解释器被设置为 nologin,则代表该用户不能登录到系统中
[root@server12 ~]# useradd -d /home/xiaojuanm -u 8888 -s /sbin/nologin xiaojuanmao
[root@server12 ~]# id xiaojuanmao
uid=8888(xiaojuanmao) gid=8888(xiaojuanmao) groups=8888(xiaojuanmao)
1.2 groupadd 命令
groupadd命 令用于创建 用户组 ,格式为 groupadd [选项 ] 群组名”。
为了能够更加高效地指派系统中各个用户的权限,在工作中常常会把几个用户加入到同一个组里面,这样便可以针对一类用户统一安排权限。
[root@server12 ~]# groupadd rony
1.3 usermod命令
usermod命令用于修改用户的属性,格式为“ usermod [选项 ] 用户名”。
我们先来看一下账户xiaojuanmao的默认信息:
[root@server12 ~]# id xiaojuanmao
uid=8888(xiaojuanmao) gid=8888(xiaojuanmao) groups=8888(xiaojuanmao)
然后将用户加入到 root用户组中,这样扩展组列表中则会出现 root用户组的字样,而基本组不会受到影响:
[root@server12 ~]# usermod -G root xiaojuanmao
[root@server12 ~]# id xiaojuanmao
uid=8888(xiaojuanmao) gid=8888(xiaojuanmao) groups=8888(xiaojuanmao),0(root)
再来试试用-u参数修改 linuxprobe用户的 UID号码值。
[root@server12 ~]# usermod -u 2000 xiaojuanmao
[root@server12 ~]# id xiaojuanmao
uid=2000(xiaojuanmao) gid=8888(xiaojuanmao) groups=8888(xiaojuanmao),0(root)
1.4 passwd命令
passwd命令用于修改用户密码、过期时间、认证信息等,格式为“ passwd [选项 ] [用户名] 。
普通用户只能使用passwd命令修改自身的系统密码,而 root管理员则有权限修改其他所有人的密码。
假设您有位同事正在度假,而且假期很长,那么可以使用passwd命令禁止该用户登录系统,等假期结束回归工作岗位时,再使用该命令允许用户登录系统,而不是将其删除。这样既保证了这段时间内系统的安全,也避免了频繁添加、删除用户带来的麻烦:
###锁定用户不能登录
[root@server12 ~]# passwd -l xiaojuanmao
Locking password for user xiaojuanmao.
passwd: Success
[root@server12 ~]# passwd -S xiaojuanmao
xiaojuanmao LK 2020-04-30 0 99999 7 -1 (Password locked.)
###解除锁定
[root@server12 ~]# passwd -u xiaojuanmao
Unlocking password for user xiaojuanmao.
passwd: Success
[root@server12 ~]# passwd -S xiaojuanmao
xiaojuanmao PS 2020-04-30 0 99999 7 -1 (Password set, SHA512 crypt.)
1.5 userdel命令
userdel命令用于删除用户,格式为“ userdel [选项 ] 用户名”。
[root@server12 ~]# userdel -r xiaojuanmao
[root@server12 ~]# id xiaojuanmao
id: xiaojuanmao: no such user
2.文件权限与归属
2.1 文件的rwx
“可读”表示能够读取文件的实际内容;
“可写”表示能够编辑、新增、修改、删除文件的实际内容;
- List item
“可执行”则表示能够运行一个脚本程序。
2.2 目录的rwx
“可读”表示能够读取目录内的文件列表;
“可写”表示能够在目录内新增、删除、重命名文件;
“可执行”则表示能够进入该目录。
文件的读、写、执行权限可以简写为rwx,亦可分 别用数字 4、 2、 1来表示
2.3 文件的特殊权限
SUID
SUID是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有对二进制程序进行设置,临时拥属主的特殊权限(仅对拥有执行权限的二进制程序有效)
例如,所有用户都可以执行 passwd命令来修改自己的用户密码,而用户密码保存在 /etc/shadow文件中。仔细查看这个文件就会发现它的默认权限是 000,也就是说除了 root管理员以外,所有用户都没有查看或编辑该文件的权限。但是,在使用 passwd命令时如果加上 SUID特殊权限位,就可让普通用户临时获得程序所有者的身份,把变更的密码信息写入到 shadow文件中。
[xiaojuanmao@server12 ~]$ ls -l /etc/shadow
----------. 1 root root 1309 May 1 02:39 /etc/shadow
[xiaojuanmao@server12 ~]$ ls -l /bin/passwd
-rwsr-xr-x. 1 root root 27832 Jan 29 2014 /bin/passwd
###仔细看第一个用户的权限是rws
如果原先权限位上没有 x执行权限,那么被赋予特殊权限后将变成大写的 S。
SGID
SGID是让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置);
或在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。
例如:如果现在需要在一个部门内设置共享目录,让部门内的所有人员都能够读 取目录中的内容,那么就可以创建部门共享目录后,在该目录上设置 SGID特殊权限位。这样,部门内的任何人员在里面创建的任何文件都会归属于该目录的所属组,而不再是自己的基本用户组。
[root@server12 ~]# cd /tmp
[root@server12 tmp]# mkdir testdir
[root@server12 tmp]# ls -ld testdir/
drwxr-xr-x. 2 root root 6 May 1 02:46 testdir/
[root@server12 tmp]# chmod -Rf 777 testdir/
[root@server12 tmp]# chmod g+s testdir/
[root@server12 tmp]# l`在这里插入代码片`s -ld testdir/
drwxrwsrwx. 2 root root 6 May 1 02:46 testdir/
在使用上述命令设置好目录的777权限(确保普通用户可以 向其中写入文件),并为该目录设置了 SGID特殊权限位后,就可以切换至一个普通用户,然后尝试在该目录中创建文件,并查看新创建的文件是否会继承新创建的文件所在的目录的所属组名称:
[root@server12 tmp]# su - xiaojuanmao
Last login: Fri May 1 02:39:23 EDT 2020 on pts/0
[xiaojuanmao@server12 ~]$ cd /tmp/testdir/
[xiaojuanmao@server12 testdir]$ echo "xiaojuanmao.com" >test
[xiaojuanmao@server12 testdir]$ ls -al test
-rw-rw-r--. 1 xiaojuanmao root 16 May 1 02:50 test
SBIT
特殊权限位,用 chmod命令就可以了。对应的
参数 o+t代表设置 SBIT粘滞位权限
SBIT Sticky Bit)特殊权限位了(也可以称之为特殊权限位之粘滞位)。 SBIT特殊权限位可确保用户只能删除自己的文件,而不能删除其他用户的文件。
当目录被设置 SBIT特殊权限位后,文件的其他人权限部分的 x执行权限就会被替换成 t或者 T,原本有 x执行权限则会写成 t,原本没有 x执行权限则会被写成 T。
例如/tmp自带设置了粘滞位
[xiaojuanmao@server12 testdir]$ ls -ld /tmp
drwxrwxrwt. 11 root root 4096 May 1 02:50 /tmp
[xiaojuanmao@server12 ~]$ cd /tmp/
[xiaojuanmao@server12 tmp]$ echo "xiaojuanmao.com" > test
[xiaojuanmao@server12 testdir]$ ls -al test
-rw-rw-r--. 1 xiaojuanmao root 16 May 1 02:50 test
当切换别的普通用户时,去尝试删除别的用户的文件时会失败,因为只能删除自己的文件
[root@server12 tmp]# su - barry
Last login: Fri May 1 02:57:45 EDT 2020 on pts/0
[barry@server12 ~]$ cd /tmp
[barry@server12 tmp]$ rm -f test
rm: cannot remove ‘test’: Operation not permitted
chown与chmod
chmod命令用来设置文件或目录的权限,格式为“ chmod [参数 ] 权限 文件或目录名称”。
chmod命令可以设置文件或目录的所有者和所属组,命令为 chown,其格式为 chown [参数 ] 所有者 :所属组 文件或目录名称”。
chmod命令和chown命令,针对目录进行操作时需要加上大写参数== -R来表示递归操作,即对目录内所有的文件进行整体操 作==。
2.4 文件的隐藏属性
chattr命令用于设置文件的隐藏权限,格式为“ chattr [参数 ] 文件”。如果想要把某个隐藏
功能添加到文件上,则需要在命令后面追加“ “+参数”,如果想要把某个隐藏功能移出文件,
则需要追加“ “-参数”。
chattr命令
系统会如此安全。接下来我们再次新建一个普通文件,并为其设置不允许删除与覆盖(+a参数)权限,然后再尝试将这个文件删除:
[root@server12 tmp]# echo "for test" > linux
[root@server12 tmp]# chattr +a linux
[root@server12 tmp]# rm linux
rm: remove regular file ‘linux’? y
rm: cannot remove ‘linux’: Operation not permitted
lsattr命令
lsattr命令用于显示文件的隐藏权限,格式为lsattr [参数 ] 文件”。
[root@server12 tmp]# ls -al linux
-rw-r--r--. 1 root root 9 May 1 03:13 linux
[root@server12 tmp]# lsattr linux
-----a---------- linux
2.5 文件访问控制列表
通俗来讲,基于普通文件或目录设置 ACL其实就是针对指定的用户或用户组设置文件或目录的操作权限。
另外,如果针对某个目录设置了 ACL,则目录中的文件会继承其 ACL;若针对文件设置了 ACL,则文件不再继承其所在目录的 ACL。
setfacl 命令
setfacl命令用于管理文件的 ACL规则,格式为“ setfacl [参数 ] 文件名称”。文件的 ACL提供的是在所有者、所属组、其他人的读 /写 /执行权限之外的特殊权限控制,使用 setfacl命令可以针对单一用户或用户组、单一文件或目录来进行读 /写 /执行权限的控制。其中,针对目录文件需要使用 -R递归参数;针对普通文件则使用 -m参数;如果想要删除某个文件的 ACL则可以使用 -b参数。
[xiaojuanmao@server12 ~]$ cd /root/
-bash: cd: /root/: Permission denied
下面来设置用户在参数。下面来设置用户在 /root目录上的权限:
[root@server12 tmp]# setfacl -Rm u:xiaojuanmao:r-x /root
[root@server12 tmp]# su - xiaojuanmao
Last login: Fri May 1 03:19:32 EDT 2020 on pts/0
[xiaojuanmao@server12 ~]$ cd /root/
[xiaojuanmao@server12 root]$ ls
1111 222 epel-release-7-12.noarch.rpm example.sh install.log user.txt
123 a epel-release-7-12.noarch.rpm.1 findfiles key.sh
可以看到文件的权限最后一个点(.)变成了加号(+),这就意味着该文件已经设置了 ACL
[root@server12 tmp]# ls -ld /root/
dr-xr-x---+ 7 root root 4096 Apr 28 07:31 /root/
getfacl 命令
getfacl命令用于显示文件上设置的 ACL信息,格式为“ getfacl 文件名称”。
[root@server12 tmp]# getfacl /root/
getfacl: Removing leading '/' from absolute path names
# file: root/
# owner: root
# group: root
user::r-x
user:xiaojuanmao:r-x
group::r-x
mask::r-x
other::---
2.6 su 命令与 sudo 服务
su命令可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,顺畅地切换到其他用户,比如从su命令与用户名之间有一个减号( (-),这意味着完全切换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息。强烈建议在切换用户身份时添加这个减号(-)。
sudo命令用于给普通用户提供额外的权限来完成原本 root管理员才能完成的任务,格式
为“ sudo [参数 ] 命令名称”。
[root@server12 ~]# visudo
89 ##
90 ## Allow root to run any commands anywhere
91 root ALL=(ALL) ALL
92 xiaojuanmao ALL=(ALL) ALL
切换用户
[root@server12 ~]# su - xiaojuanmao
Last login: Fri May 1 03:49:10 EDT 2020 on pts/0
[xiaojuanmao@server12 ~]$ sudo -l
[sudo] password for xiaojuanmao:
Matching Defaults entries for xiaojuanmao on this host:
!visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS",
env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION
LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE",
env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin
User xiaojuanmao may run the following commands on this host:
(ALL) ALL
作为一名普通用户,是肯定不能看到root管理员 的 家目录(/root)中的文件信息的,但是,只需要在想执行的命令前面加上 sudo命令就可以了:
[xiaojuanmao@server12 ~]$ ls /root
ls: cannot open directory /root: Permission denied
[xiaojuanmao@server12 ~]$ sudo ls /root/
1111 222 backup.tar.gz error.txt Guess.sh readme.txt
123 a epel-release-7-12.noarch.rpm example.sh install.log user.txt
160_file anaconda-ks.cfg epel-release-7-12.noarch.rpm.1 findfiles key.sh
考虑到生产环境中不允许某个普通用户拥有整个系统中所有命令的最高执行权(这也不符合前文提到的权限赋予原 则,即尽可能少地赋予权限),因此 ALL参数就有些不合适了。因此只能赋予普通用户具体的命令以满足工作需求,这也受到了必要的权限约束。如果需要让某个用户只能使用 root管理员的身份执行指定的命令,切记一定要给出该命令的绝对路径,否则系统会识别不出来。我们可以先使用 whereis命令找出命令所对应的保存路径,然后把配置文件的用户权限参数修改成对应的路径即可:
[root@server12 ~]# visudo
90 ## Allow root to run any commands anywhere
91 root ALL=(ALL) ALL
92 xiaojuanmao ALL=(ALL) /usr/bin/cat
在编辑好后依然是先保存再退出。再次切换到指定的普通用户,然后尝试正常查看某个文件的内容,此时系统提示没有权限。这时再使用 sudo命令就可以顺利地查看文件内容了:
[root@server12 ~]# su - xiaojuanmao
Last login: Fri May 1 03:49:54 EDT 2020 on pts/0
[xiaojuanmao@server12 ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
[xiaojuanmao@server12 ~]$ sudo cat /etc/shadow
root:$6$cOuPxUFA$qTmiXKkVq3QwRvPLxc4nDlVnGT8Gvg9V5MJJRXqm2vJe9HC9TEzfegrnF0MUonDasFHwG3wmLY19Q4UiNgn5l1:18373:0:99999:7:::
bin:*:16925:0:99999:7:::
daemon:*:16925:0:99999:7:::
adm:*:16925:0:99999:7:::
lp:*:16925:0:99999:7:::
sync:*:16925:0:99999:7:::
..............省略..........
命令都要输入一次密码其实也挺麻烦的,这时可以添加 NOPASSWD参数,使得用户执行 sudo命令时不再需要密码验证:
92 xiaojuanmao ALL=NOPASSWD: /usr/bin/cat