目录
一:用户和组信息的查看
查看用户信息
查看密码信息
查看组信息
特殊组wheel
二:用户和组信息的管理
用户管理
组管理
三:文件权限
文件权限的查看
文件权限的修改
ACL控制权限 setfacl 、 getfacl
Umask、Suid、Sgid、粘滞位
四:Linux中的sudo、sudo -i、su、su -命令
相关文章:Linux用户方面的加固
前言:在linux中一切都是文件(文件夹和硬件设备是特殊的文件),如果有可能尽量使用文本文件。文本文件是人和机器能理解的文件,也成为人和机器进行交流的最好途径。由于所有的配置文件都是文本,所以你只需要一个最简单的编辑器就可以修改。由于修改文本文件如此简单,所以Linux系统本身肯定要加以规范。这就引出了用户(组)和权限这2个概念。而这2个概念的引入,完美的保证了Linux的安全性,同时没有添加复杂性。由于一切皆为文件。所以Linux引入了3个文件来管理用户(组), /etc/passwd存放用户信息,/etc/shadow存放用户密码信息,/etc/group存放组信息,然后在文件系统中的每个文件的文件头里面添加了用户和文件之间的关系信息。
用户、组、文件间有三种关系
将这三种关系叠加,用户和文件的最终关系可以归纳为3类
在Linux下,用户分为三类:超级用户(root)、普通用户、程序用户。
有三个命令可以查看用户的相关信息
cat /etc/passwd #查看用户信息
cat /etc/shadow #查看用户的密码信息
cat /etc/group #查看用户的组信息
cat /etc/passwd #/etc/passwd默认权限为644,其最小权限为444
用户信息的显示有7个字段
注:一般来说,只有 root 用户的 uid 是为0的。如果黑客把一个普通用户的 uid 修改为0的话,那么他只要以普通用户的用户名和密码登录,系统就会自动切换到root用户。所以,系统加固的时候一定要过滤出有哪些用户的UID为0
使用脚本查看用户信息
#! /bin/bash
# Author:谢公子
# Date:2018-10-12
# Function:根据用户名查询该用户的所有信息
read -p "请输入要查询的用户名:" A
echo "------------------------------"
n=`cat /etc/passwd | awk -F: '$1~/^'$A'$/{print}' | wc -l`
if [ $n -eq 0 ];then
echo "该用户不存在"
echo "------------------------------"
else
echo "该用户的用户名:$A"
echo "该用户的UID:`cat /etc/passwd | awk -F: '$1~/^'$A'$/{print}'|awk -F: '{print $3}'`"
echo "该用户的组为:`id $A | awk {'print $3'}`"
echo "该用户的GID为:`cat /etc/passwd | awk -F: '$1~/^'$A'$/{print}'|awk -F: '{print $4}'`"
echo "该用户的家目录为:`cat /etc/passwd | awk -F: '$1~/^'$A'$/{print}'|awk -F: '{print $6}'`"
Login=`cat /etc/passwd | awk -F: '$1~/^'$A'$/{print}'|awk -F: '{print $7}'`
if [ $Login == "/bin/bash" ];then
echo "该用户有登录系统的权限!!"
echo "------------------------------"
elif [ $Login == "/sbin/nologin" ];then
echo "该用户没有登录系统的权限!!"
echo "------------------------------"
fi
fi
cat /etc/shadow #shadow默认权限为600,最小权限为400
密码信息的显示有9个字段
字段2是用户的密码位,如果是 * 表示该用户禁用,!! 表示用户密码未初始化,如果为空,表示空密码的
注:借助chage指令,可以修改用户的密码策略,也可通过编辑 /etc/shadow (不建议)
比如:chage -l bob,查看用户bob的密码策略
chage -M 90 bob,将用户bob的密码有效期修改为90天
脚本实现修改用户的密码策略
#! /bin/bash
# Author:谢公子
# Date: 2018-10-12
# Function: 实现对用户密码策略的设定,如密码最长有效期等
read -p "设置密码最多可多少天不修改:" A
read -p "设置密码修改之间最小的天数:" B
read -p "设置密码最短的长度:" C
read -p "设置密码失效前多少天通知用户:" D
sed -i '/^PASS_MAX_DAYS/c\PASS_MAX_DAYS '$A'' /etc/login.defs
sed -i '/^PASS_MIN_DAYS/c\PASS_MIN_DAYS '$B'' /etc/login.defs
sed -i '/^PASS_MIN_LEN/c\PASS_MIN_LEN '$C'' /etc/login.defs
sed -i '/^PASS_WARN_AGE/c\PASS_WARN_AGE '$D'' /etc/login.defs
echo "已设置好密码策略......"
cat /etc/group
组信息的显示有四个字段
注:一个用户只能有一个主要组,最多可以有31个附加组。主要组是用户创建文件时默认的所有组,附加组主要用于权限管理。不论用户属于哪个组,用户都能拥有该组的权限
在Linux中有一个特殊组wheel,wheel组就类似于一个管理员的组。在linux中,即使我们有系统管理员root的权限,也不推荐用root用户登录。一般情况下用普通用户登录就可以了,在需要root权限执行一些操作时,再su登录成为root用户。但是,任何人只要知道了root用户的密码,就都可以通过su命令来登录为root用户--这无疑为系统带来了安全隐患。所以,将普通用户加入到wheel组中,被加入的这个普通用户就成了管理员组内的用户了,然后可以修改配置文件使得只有wheel组内的用户可以切换到root用户。
相关文章:设置只有指定用户能使用su命令切换到root用户
新建用户系统会做三件事
添加用户时指定参数:
useradd tom #新建tom用户,其配置默认
useradd -u 2000 -g james bob #新建bob用户,将其uid设置为 2000,将其所在的组设置为 james ( 不修改默认是bob ),前提是james组已经存在
useradd -G root tom #新建tom用户,指定其附加组为root
useradd -s /sbin/nologin tom #新建tom用户,但是不让tom用户有登录系统的权限,默认是 /bin/bash ,没登录权限的话是 /sbin/nologin
useradd -d /test tom #新建tom用户,指定其家目录为 /test (默认是 /home/tom)
useradd -M tom #新建tom用户,但是不在home目录下新建目录(默认创建新用户会在home目录下新建同名的家目录)
useradd xie;echo 'xie:123456'|chpasswd #添加用户xie,密码为 123456
注:用户创建时,默认的属性(比如UID,GID,是否创建家目录,创建邮箱等)都是通过/etc/login.defs文件控制的,修改此文件的属性,会影响以后创建的所有用户。也可以创建用户时指定参数修改,这样只对当前创建用户有效
删除用户 :
userdel -r james #删除用户一定记得加 -r 参数 !!
修改账户密码 :
passwd james #给james用户设置密码
当前用户为 root 时:
当前用户为普通用户时:
修改账户属性:
usermod 参数 james
[root@Redhat ]# id james
uid=1000(james) gid=2002(james) 组=2002(james)
[root@Redhat ]# usermod -g aaa james ; id james; //修改用户的主组为aaa
uid=1000(james) gid=2000(aaa) 组=2000(aaa)
[root@Redhat ]# usermod -G xie james ;id james; //给用户添加附加组 xie
uid=1000(james) gid=2000(aaa) 组=2000(aaa),1000(xie)
[root@Redhat ]# usermod -G xiao james ;id james; //给用户添加附加组xiao,并且如果原来有附加组的话替换原来的附加组
uid=1000(james) gid=2000(aaa) 组=2000(aaa),2001(xiao)
[root@Redhat ]# usermod -aG xie james;id james; //给用户添加附加组 xie ,并且不替换原来的附加组
uid=1000(james) gid=2000(aaa) 组=2000(aaa),1000(xie),2001(xiao)
锁定和解锁用户 :
注:虽然 usermod 和 passwd 这两个命令都可以锁定和解锁用户,但是还是有区别的。区别之一就是passwd命令操作完后会有提示。还有一个区别就是 passwd 的权限比 usermod 大,使用 usermod 锁定的用户可以用 passwd 来解锁,但是使用 passwd 锁定的用户不能用 usermod 来解锁
添加组 : groupadd xie
删除组: groupdel xie
注:只能删除附加组,而不能删除主组!!!!
修改组的属性: groupmod xie
-g, --gid GID 将组 ID 改为 GID
-n, --new-name 改名为 NEW_GROUP
-o, --non-unique 允许使用重复的 GID
groupmod -g 2000 bob //将bob组的GID修改为2000
groupmod -n aaa bob //将bob组的名字改为aaa
groups bob //查看bob所属的所有组
修改组中的用户:groupmems
groupmems -a john -g xie 将用户john加到xie组中
groupmems -d john -g xie 将用户john从xie组中移除 或 gpasswd -d john xie
使用 ls -lh 可以查看文件的具体信息,其中包括不同的用户对该文件的权限
drwxr-xr-x. 3 root root 97 8月 24 23:04 abrt
-rw-r--r--. 1 root root 16 8月 24 23:08 adjtime
我们拿 abrt 这个目录和 adjtime这个文件来解释。
前11个字符确定不同用户能对文件干什么
第一个字符代表文件(-)、目录(d),链接(l) 设备(C) 块设备(b)
其余字符每3个一组(rwx),读(r)、写(w)、执行(x)
最后的 . 代表没有ACL扩展权限 + 代表有ACL扩展权限。
针对文件:
针对目录:
注:目录的权限比较特殊,可以看到,x 权限是目录最基本的权限,因为如果你都不能进入该目录,那读取内容和增删改查就更无从所起了。还有一个就是当你对目录拥有 rwx 权限的时候。倘若目录中有一个文件,该文件对你的权限是没有 w 权限的,但是因为你先匹配到该目录的权限,可以对目录中的文件修改,所以你可以强制修改该文件,保存退出!
后面的各个字段的含义:
例子: 这里有几个用户,其UID和GID分别如下
root 用户: uid=0(root) gid=0(root) groups=0(root)
xie 用户: uid=1000(xie) gid=1001(john) groups=1001(john)
john 用户: uid=1001(john) gid=1001(john) groups=1001(john)
james用户: uid=1002(james) gid=1002(james) groups=1002(james)
jerry用户: uid=1003(jerry) gid=1002(james) groups=1002(james)
然后,我们以root身份新建一个文件夹 test ,则test默认的权限如下
drwxr-xr-x 2 root root 4096 Aug 31 19:16 test
我们修改其文件权限,文件所有者,文件所在组,修改为如下
drwxrwx--- 2 xie james 4096 Aug 31 19:19 test
最后得到的结论如下:
xie用户的身份是文件所有者,其可以在该目录下创建文件,且创建文件的信息如下 -rw-r--r-- 1 xie john 0 Aug 31 19:45 file1
john用户的身份是other,对该文件不可以做任何操作
james用户是身份是文件所属组的成员,其在该目录下创建文件的信息如下 -rw-rw-r-- 1 james james 0 Aug 31 19:32 file2
jerry用户的身份是文件所属组的成员,其在该目录下创建文件的信息如下 -rw-r--r-- 1 jerry james 0 Aug 31 19:43 file3
修改文件的权限 chmod
chmod 755 abrt //赋予abrt权限rwxr-xr-x
chmod u=rwx ,g=rx,o=rx abrt //赋予abrt rwxr-xr-x权限。u=用户权限,g=组权限,o=不同组其他用户权限
chmod u-x , g+w abrt //给abc去除用户执行的权限,增加组写的权限
chmod a+r abrt //给所有用户添加读的权限
修改文件的所有者 chown 和 所属组 chgrp
chown bob adjtime // 改变 adjtime 的所有者为 bob
chgrp root abrt //改变 adjtime 所属的组为 root
chgrp -R root abrt //改变abc这个目录及其目录下所有的文件的所属的组织为 root
chown ‐R root abrt //改变abc这个目录及其下面所有的文件和目录的所有者是 root
注:修改文件和文件夹所有者和所属组方法都是一样的,如果要把文件夹内的文件的所有者和所属组都修改了,要加 -R 参数。chown除了可以修改属主属性,还可以修改所属组属性。 语法: chown 属主:属组 文件
chown john:james adjtime //改变 adjtime 的所有者为john,所属组为 james
setfacl :设置文件访问控制规则
getfacl : 获取文件访问控制规则
例子: 这里有几个用户,其UID和GID分别如下
用户a: uid=1006(a) gid=1006(a) groups=1006(a)
用户b: uid=1007(b) gid=1007(b) groups=1007(b)
用户c: uid=1007(c) gid=1000(root) groups=1000(root)
我们以root身份在根目录下新建一个文件file,其权限如右:-rw-r--r-- 1 root root 4 Aug 31 23:00 file
其acl信息如下: getfacl file
# file: file
# owner: root
# group: root
user::rw-
group::r--
other::r--
所以用户a和用户b只对他有读的权限,现在我们要让用户a拥有rwx权限,而用户b不变化
设置用户a的ACL权限:setfacl -m u:a:rwx file
设置完acl之后,文件file的权限就变成了: -rw-rwxr--+ 1 root root 4 Aug 31 23:01 file
注:用户的组权限位变化,等于acl信息中的mask值,还多了一个+扩展权限位。此时虽然用户c是root组中的,但是用户c对文件file的权限还仍然是之前的r--,而不是rwx
查看file的acl信息 getfacl file ,显示如下
# file: file
# owner: root
# group: root
user::rw-
user:a:rwx // 用户a的ACL权限
group::r--
mask::rwx // 等于用户之前的权限与acl设置的权限进行 或运算
other::r-
可知,用户a对其有rwx权限,用户b对其仍然只有 r 的权限
若要移除acl ,则 setfacl -x u:a file
移除了之后,a的权限就又还是只有 r 的权限了
注:若a用户原来对文件只有 r 权限,设置的acl是 setfacl -m u:a:w file ,则设置完acl后,用户a只对文件有 w 权限,没有 r 权限了
倘若要让一个文件夹内的所有已存在文件都继承于文件夹的设置的acl的权限属性, 可以使用 setfacl -R -m u:a:rwx 文件名
UMSK
root用户的umask值默认是0022,普通用户的umask值默认是 0002。umask值是可以手动修改的。第一位是特殊位,配置了SUID(4) 、SGID(2) 和 粘滞位(1) 才有值。
所以当root用户去创建一个文件夹的时候,其权限就是 777-022=755,而创建一个文件的时候,其权限就是 755-111=644
普通用户去创建一个文件夹的时候,其权限就是 777-002=775,而创建一个文件的时候,其权限就是 775-111-664
所以root用户和普通用户权限的不同之处就在于group组。root用户的属组位置的 w 只在自己的手中。而普通用户的属组权限只要是和他在一个组内,就拥有 w 权。
SUID 、SGID和粘滞位
SUID的作用:SUID是set uid的简称,它出现在文件所属主权限的执行位上面,标志为 s 。当设置了SUID后,UMSK第一位为4。我们知道,我们账户的密码文件存放在/etc/shadow中,而/etc/shadow的权限为 ----------。也就是说:只有root用户可以对该目录进行操作,而其他用户连查看的权限都没有。当普通用户要修改自己的密码的时候,可以使用passwd这个指令。passwd这个指令在/bin/passwd下,当我们执行这个命令后,就可以修改/etc/shadow下的密码了。那么为什么我们可以通过passwd这个指令去修改一个我们没有权限的文件呢?这里就用到了suid,suid的作用是让执行该命令的用户以该命令拥有者即root的权限去执行,意思是当普通用户执行passwd时会拥有root的权限,这样就可以修改/etc/passwd这个文件了。命令: chmod u+s 文件名
使用suid需要满足的几个条件
SGID的作用:SGID是set gid的简称,它出现在文件所属组权限的执行位上面,标志位 s 。它用当设置了SGID后,UMSK第一位为2 。它作用于目录,当用户 a 对某一目录有rwx 权限时,该用户就可以在该目录下建立文件,新建文件的所属主和所属组继承于 a。当另一个用户 b 也对该目录有rwx权限的时候,就可以修改 a 创建的文件,而且修改后的文件所属主和所属组都会变成 b!但是如果该目录用SGID修饰,则所有拥有 rwx权限的用户在这个目录下建立的文件都是属于这个目录所属的组。当其他用户修改时,有三种情况:
SGID的例子代码
例子: 这里有几个用户,其UID和GID分别如下
s1 用户: uid=1004(s1) gid=1005(s1) groups=1005(s1),1004(sgid)
s2 用户: uid=1005(s2) gid=1006(s2) groups=1006(s2),1004(sgid)
我们以root身份在根目录下创建一个 test 文件 ,其默认权限如右:drwxr-xr-x 2 root root 4096 Aug 31 20:54 test
修改其默认权限如右:drwxrwx--- 2 root sgid 4096 Aug 31 20:54 test
因为s1和s2都是组sgid内的成员,所以s1和s2均可对test文件执行rwx权限
s1进入test内,创建一个文件 file1 ,其权限如右: -rw-rw-r-- 1 s1 s1 3 Aug 31 21:01 file1
s2进入test内,用vim打开file1文件,显示文件read only。对其修改,强制保存退出!然后file1的权限如右:-rw-rw-r-- 1 s2 s2 3 Aug 31 21:04 file1
可见,s2可以强制修改s1创建的文件。虽然s2对于file1来说是other,但是因为s1和s2均属于sgid组,所以可以对test文件夹内的数据拥有读写执行的权限,所以可以用vim对其强制修改保存退出。修改后,file1文件的所属用户和所属组都变成了s2的了。
显然,这不是我们想要的,如果我们想要s2修改了文件后,文件的所有用户和所属组都不变的话,我们就需要用到SGID了。
执行 chmod g+s /test
s1再新建一个文件file2,其权限如右:-rw-rw-r-- 1 s1 sgid 3 Aug 31 21:03 file2 可见,其所属组继承了文件夹test的所属组
s2再用vim打开file2,不提示文件read only了,修改,保存退出!然后file2的权限如右:-rw-rw-r-- 1 s1 sgid 13 Aug 31 21:04 file2
可见,执行了SGID后,同一组内的其他成员修改文件后,其属主和属组都不发生变化!
粘滞位的作用:
SBIT即Sticky Bit,它出现在其他用户权限的执行位上,标志位为 t,当设置了粘滞位后,UMSK第一位为1 。它只能用来修饰一个目录。当某一个目录拥有SBIT权限时,则任何一个能够在这个目录下建立文件的用户,该用户在这个目录下所建立的文件,只有该用户自己和root可以修改和删除,其他用户均不可以修改和删除!!我们知道/tmp是系统的临时文件目录,所有的用户在该目录下拥有所有的权限,也就是说在该目录下可以任意创建、修改、删除文件,那如果用户A在该目录下创建了一个文件,用户B将该文件删除或修改了,这种情况我们是不能允许的。为了达到该目的,就出现了stick bit(粘滞位)的概念。
无论是两个用户都属于group组,还是都属于other,或者是一个属于group,一个属于other,都不能对其他人创建的文件进行修改和删除!!
例子: 这里有几个用户,其UID和GID分别如下
用户a: uid=1006(a) gid=1007(a) groups=1007(a)
用户b: uid=1007(b) gid=1008(b) groups=1008(b)
我们以root身份在根目录下创建一个 test 文件 ,其默认权限如右:drwxr-xr-x 2 root root 4096 Aug 31 20:54 test
我们修改其权限:drwxrwxrwx 2 root root 4096 Aug 31 20:54 test
用户a匹配test文件夹的other权限,拥有rwx权限,进入test内,新建文件夹file1,其权限如右:-rw-rw-r-- 1 a a 5 Aug 31 21:45 file1
用户b匹配test文件夹的other权限,拥有rwx权限,进入test内,可以执行删除file1。因为用户b拥有文件夹test的rwx权限,所以可以对其文件夹内的所有数据删除。即使file1的other权限是只读!!
很明显,这不是我们想要的
执行 chmod o+t /test
s1再新建一个文件file2,其权限如右:-rw-rw-r-- 1 a a 3 Aug 31 21:03 file2
s2再尝试删除file2,删不了!!只有文件的主人可以删除
可见,执行了栈滞位后,只有文件的所有者才可以删除文件
注意:有时你设置了s 或 t 权限,你会发现它变成了S或T,这是因为在那个位置上你没有给它x(可执行)的权限,这样的话这样的设置是不会有效的,你可以先给它赋上x的权限,然后再给s或t 的权限
sudo :暂时切换到超级用户模式以执行超级用户权限,提示输入密码时该密码为当前用户的密码,而不是超级账户的密码。缺点是每次执行超级用户权限都要在命令前加上 sudo ,优点是在当前终端再使用 sudo 不要再重复输入密码(只对于当前终端有效)。
sudo -i:为了频繁的执行某些只有超级用户才能执行的权限,而不用每次输入密码,可以使用该命令。提示输入密码时该密码为当前账户的密码。没有时间限制。执行该命令后提示符变为“#”而不是“$”。想退回普通账户时可以执行“exit”或“logout” 。
注意:但是只有指定的一些用户才有执行 sudo 的权限,具体配置在 /etc/sudoers 文件中。
有两个方法:第一是将该用户加入 wheel组中(因为/etc/sudoers中默认加入了wheel组中的用户可以使用sudo权限),第二是在/etc/sudoers文件中加入 hack ALL=(ALL) ALL
参考:Linux下如何让普通用户具备sudo执行权限
su : 切换到某某用户模式,提示输入密码时的密码为切换后账户的密码,用法为“su 账户名称”。如果后面不加账户时系统默认为root账户,密码也为超级账户的密码。没有时间限制。
su - :su - 和 su 的不同之处在于 su - 切换用户后的目录为切换后目录的家目录,而 su 则是原目录