目录
-
用户和文件的关系只有2种, 拥有和不拥有。
-
组和文件的关系只有2种, 拥有和不拥有。
-
用户和组的关系只有2种, 属于和不属于。
-
用户拥有该文件
-
用户属于某个组,某个组拥有该文件(即用户通过属于某组来拥有该文件)
-
用户不拥有该文件
一:用户和组信息的查看
-
超级用户:UID=0
-
程序用户:Rhel5/6,UID=1-499; Rhel7,UID=1-999
-
普通用户:Rhel5/6,UID=500-65535; Rhel7,UID=1000-60000
cat /etc/passwd
cat /etc/shadow
cat /etc/group
查看用户信息
cat /etc/passwd #/etc/passwd默认权限为644,其最小权限为444
-
字段1:用户名 --> root
-
字段2:密码占位符 --> x (这里都是用x代替)
-
字段3:uid,用户id --> 0
-
字段4:gid ,组id --> 0
-
字段5:用户描述信息 --> root
-
字段6:家目录 --> /root
-
字段7:登录 shell (用户登陆shell ,当为/bin/bash表示可以登陆,/sbin/nologin表示不被授权登陆)
注:一般来说,只有 root 用户的 uid 是为0的。如果黑客把一个普通用户的 uid 修改为0的话,那么他只要以普通用户的用户名和密码登录,系统就会自动切换到root用户。所以,系统加固的时候一定要过滤出有哪些用户的UID为0
使用脚本查看用户信息
# 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
-
字段1:用户名
-
字段2:通过sha-512加密(二次加密,在经过第一次加密后,第二次加入随机数再次加密)的密码
-
字段3:最后一次修改密码距离1970年1月1日的天数间隔
-
字段4:密码最短有效期
-
字段5:密码最长有效期
-
字段6:密码过期前几天进行警告
-
字段7:账户过期后,被锁定的天数
-
字段8:账号失效时间距离1970年1月1日的天数间隔
-
字段9:未分配功能
注:借助chage指令,可以修改用户的密码策略,也可通过编辑 /etc/shadow (不建议)
比如:chage -l bob,查看用户bob的密码策略
chage -M 90 bob,将用户bob的密码有效期修改为90天
脚本实现修改用户的密码策略
查看组信息
cat /etc/group
-
字段1:组名称 --> root
-
字段2:组密码占位符 --> x
-
字段3:gid --> 0
-
字段4:组成员
注:一个用户只能有一个主要组,最多可以有31个附加组。主要组是用户创建文件时默认的所有组,附加组主要用于权限管理。不论用户属于哪个组,用户都能拥有该组的权限
特殊组wheel
二:用户和组信息的管理
用户管理
-
新建用户时,系统会将 /etc/skel 中的目录及文件拷贝到新建用户的家目录中
-
在 /var/spool/mail 中,新建用户名的邮箱
-
在 /etc下的 passwd 、shadow 、group文件中,增加用户信息
-
添加用户时,使用 -g 指定新建用户的组,使用 -u 指定用户uid
-
-G 参数可以指定新建用户的附加组
-
使用 -s /sbin/nologin 指定创建的用户没有登录系统的权限
-
还可以使用 -M 参数,指定创建的用户不在home目录下创建家目录
-
还可以使用 -d 参数 ,指定其家目录
useradd -p `openssl passwd -1 -salt 'user' 123qwe` -u 0 -o -g root -G root -s /bin/bash -d /home/user venus
注:用户创建时,默认的属性(比如UID,GID,是否创建家目录,创建邮箱等)都是通过/etc/login.defs文件控制的,修改此文件的属性,会影响以后创建的所有用户。也可以创建用户时指定参数修改,这样只对当前创建用户有效
userdel -r james #删除用户一定记得加 -r 参数 !!
-
不加 -r 参数,只删除 passwd、shadow 和 group 文件中的用户信息,/home 目录下的文件不删除,/var/spool/mail/ 下的文件不删除
-
加 -r 参数,删除 passwd、shadow 和 group 文件中的用户信息,同时删除用户的家目录和邮箱
passwd james #给james用户设置密码
不需要知道当前的密码
设置新密码时,不需要遵循密码要求
需要知道当前密码
设置新密码时,必须遵循密码要求(1.不能少于8个字符,2.满足复杂度要求)
usermod 参数 james
-s 修改用户的登陆shell usermod -s /sbin/nologin james
-L 账户锁定 (可以通过 passwd -S 账户名 查看账户的状态)
-U 解锁账户
-g 修改账户所在组 例: 将bob所在组改成james:usermod -g james bob
-G 给账户添加附加组 例:给bob添加一个附加组john:usermod -G john bob ; 从附加组john中删除用户bob:gpasswd -d bob john
-a 默认情况下,当用户已经存在附加组时,再添加附加组则会把之前的附加组给替换了,加 -a 参数,则不替换原来的附加组,意味着该用户可以有多个附加组。
[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 -L xie 或 passwd -l xie
-
解锁用户:usermod -U xie 或 passwd -u xie
-
查看用户状态:passwd -S xie
注:虽然 usermod 和 passwd 这两个命令都可以锁定和解锁用户,但是还是有区别的。区别之一就是passwd命令操作完后会有提示。还有一个区别就是 passwd 的权限比 usermod 大,使用 usermod 锁定的用户可以用 passwd 来解锁,但是使用 passwd 锁定的用户不能用 usermod 来解锁
组管理
-
-g, --gid 为新组使用 GID,例 groupadd -g 2000 xie 创建新组xie,并且gid设置为2000
-
-K, --key 不使用 /etc/login.defs 中的默认值
-
-o, --non-unique 允许创建有重复 GID 的组
-
-p, --password 为新组使用此加密过的密码
-
-r, --system 创建一个系统账户
-
-r , --remove 删除主目录和邮件池
groupmod -g 2000 bob //将bob组的GID修改为2000
groupmod -n aaa bob //将bob组的名字改为aaa
groups bob //查看bob所属的所有组
groupmems -a john -g xie 将用户john加到xie组中
groupmems -d john -g xie 将用户john从xie组中移除 或 gpasswd -d john xie
三:文件权限
文件权限的查看
-
第一组rwx:文件所有者的权限是读、写和执行
-
第二组rw-:与文件所在组同一组的用户的权限是读、写但不能执行
-
第三组r--: 不与文件所有者同组的其他用户的权限是读不能写和执行
-
r 表示可以读取文件
-
w 表示可以对文件内容做修改
-
x 表示文件可执行
-
r 表示可以列出目录内容(可以使用ls),前提是得有 x 权限,因为如果你都不能进入这个目录,你怎么列出该目录的内容
-
w 表示可以在目录中增删改查,前提是得有 x 权限,因为如果你都不能进入这个目录,你怎么增删改查
-
x 表示可以进入目录,但不一定能读取目录内的内容。要想读取目录的内容,需要有 r 权限,要想修改,需要有 w 权限!
注:目录的权限比较特殊,可以看到,x 权限是目录最基本的权限,因为如果你都不能进入该目录,那读取内容和增删改查就更无从所起了。还有一个就是当你对目录拥有 rwx 权限的时候。倘若目录中有一个文件,该文件对你的权限是没有 w 权限的,但是因为你先匹配到该目录的权限,可以对目录中的文件修改,所以你可以强制修改该文件,保存退出!
-
3 代表文件的链接数是3;
-
root 代表该文件的所属用户;
-
root 代表该文件所属的组。一般文件所属的组就是文件所属主所在的组,也有特殊情况,可以自己随意修改!!
-
97 代表文件的大小;
-
8月 24 23:04代表文件最后的修改日期;
-
abrt 表示的是文件名
例子: 这里有几个用户,其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 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 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
ACL控制权限 setfacl 、 getfacl
-
-m , 给文件加扩展ACL规则 , setfacl -m u:bob:r abrt ;
-
-x , 给文件移除扩展ACL规则 , setfacl -x u:bob abrt ;
-
-b , 移除文件所有的ACL规则 ,setfacl -b u:bob abrt ;
-
-R , 递归的对所有目录内所有的文件和目录进行操作 , setfacl -R -m u:bob:rwx abrt ;
-
-d , 设置默认的ACL规则
例子: 这里有几个用户,其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 权限了
Umask、Suid、Sgid、粘滞位
-
suid的作用:用于执行文件,以文件的拥有者的身份运行该文件。 chmod u+s 文件名
-
sgid的作用: 用于目录,在该目录下建立的所有文件和目录,属组都继承该目录的属组,且该组内其他成员修改目录内的文件时,其属主和属组都不改变! chmod g+s 目录
-
粘滞位stick bit 的作用: 用于目录,在该目录建立的文件或目录,只有建立者可以删除和修改,其他用户无法删除和修改 chmod o+t 目录
-
SUID只对可执行文件有效
-
调用者对该文件有执行权
-
在执行过程中,调用者会暂时获得该文件的所有者权限
-
该权限只在程序执行的过程中有效
-
当两个用户都是属于group组内,则修改后的文件的所属主和所属组都不会,而且修改文件时不会提示read only!可以正常修改
-
当两个用户都是属于other时,则修改后的文件的所属组不变,所属主会变成另一个用户,修改文件时会提示read only,必须强制保存退出
-
当一个用户是group组,一个是other时,则修改后的文件的所属组不变,所属主会变成另一个用户,修改文件时会提示read only,必须强制保存退出
例子: 这里有几个用户,其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后,同一组内的其他成员修改文件后,其属主和属组都不发生变化!
例子: 这里有几个用户,其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,删不了!!只有文件的主人可以删除
可见,执行了栈滞位后,只有文件的所有者才可以删除文件
来源:谢公子的博客(https://xie1997.blog.csdn.net/)
本文始发于微信公众号(谢公子学安全):Linux系统安全 | Linux下的用户、组和权限
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论