linux安全模型
- Authentication:认证,验证身份
- Authorization:授权,不同权限
- Accounting:审计
用户
- 管理员:uid 0
- 普通用户
- 系统用户:uid 1-999,给后台程序使用如mysql,nginx
- 登录用户:uid 1000+
用户组
- 一个用户可以是一个或多个组
- 用户组可以为空
- primary group(主组):私有组,必须有且只有一个,创建时会创建同名的主组
- 附加组:用户可以加入除主组外的其他组
安全上下文
用户,程序,进程,能访问的资源在权限上保持一致。
用户与组的配置相关文件
- /etc/passwd: 用户及其属性uid,gid
- /etc/shadow:用户密码及属性
- /etc/group:组及其属性
- /etc/gpasswd:组密码及其属性
getent:用于查询系统数据库
get entries
getent basename key
chsh:修改用户sh
-s shell路径
chsh -s /bin/sh root
shadow
禁用用户时可在密码字段前加上!
usermod -L jose
usermod -U jose # 解锁
vipw & vigr
安全编辑passwd,group文件
pwck & grpck
检查passwd,group文件
管理用户与组
用户管理:
组管理:
- groupadd
- groupmod
- groupdel
groupmod:组修改
-n 组改名
例
1
2
3
4
5
6
7
8
9
10
11
12
|
# 先创建用户组,这样创建用户时可指定
groupadd -g 111 -r loong # -g 指定gid,-r系统组
useradd -u 111 -g loong -s /bin/bash -d /home/loong -M -r loong
# -u,指定uid;-g,指定组;-s,指定shell;-d指定家目录;-M,不创建家目录;-r,系统用户
# 创建用户
useradd looong
adduser -D #查看默认的参数
# /etc/skel/,是家目录模板
|
批量创建用户
1
2
3
4
5
|
cat user.txt
u1:123456:1024:1024::/home/u1:/bin/bash
u2:123456:1025:1025::/home/u2:/bin/bash
newusers user.txt
|
批量改口令
1
2
3
4
5
6
7
8
9
10
|
cat pwd.txt
u1:1234567
u2:1234567
chpasswd < pwd.txt
chpasswd <<EOF
> u1:1234567
> u2:1234567
> EOF
|
SHA512加密
openssl passwd -6 123456
-6 指定SHA512
su
1
2
3
|
su username
su - username # 会读取配置文件
su -s /bin/bash mail # nologin账户,可以指定shell,达到登录目的
|
不切换用户,使用它的权限执行
1
|
su - loong -c "touch jose-2.txt"
|
passwd:修改,设置密码
passwd -e jose
expired 到期
jose在下次登录后,会让它修改密码
gpasswd:更改组成员与密码
1
2
3
4
5
|
gpasswd -a loong group1 # 向组添加成员
gpasswd group1 # 设置组密码
gpasswd -d loong group1 # 移除组成员
|
groupmems:更改,查看组成员
1
|
groupmems -l group1 # 列出组成员
|
groups:列出自己的组列表
newgrp:临时切换组
1
|
newprp group2 # 切换之后创建的文件属组就是group2
|
文件权限管理

文件所属人所属组操作
root 的权限不受文件的权限位
chown:设置所属人,所属组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 也可使用uid,gid修改
chown jose: a2.txt # 人与组都修改了
chown :jose a2.txt # 只改了组
chown jose:jose a2.txt # 都修改
chown --reference=f1.txt f2.txt # 根据文件1修改文件2
chown -R jose.tom dir1/ # 修改文件夹下所有
chown mage --dereference a.link # 修改连接指向的文件
chown mage --no-dereference a.link # 修改链接文件本身
|
chgrp
同上
文件权限
r和w权限对root 用户无效,对没有读写权限的文件,root用户也可读可写
只要所有者,所属组或other三者之一有x权限,root就可以执行
创建文件,初始权限是644
创建目录,初始权限是755
Linux中的目录和文件的权限区别?分别说明读,写和执行权限的区别
-
r 4
- 文件:读其中内容
- 目录:查看目录下内容,但不能看文件里内容
-
w 2
-
x 1
chmod:修改文件权限
–reference=FILE
-R|–recursive
1
2
3
4
5
|
chmod u=r,g=w,o=x f2
chmod u+w,g-x,o-r f3
chmod a=rwx f4
chmod 644 a1
|
删除权限的特殊性:在 Linux 中,删除文件或目录的权限取决于该文件所在目录的写权限,而不取决于文件本身的权限。这意味着即使文件只读,如果用户对目录有写权限,仍然可以删除文件。
1
2
3
4
5
|
[loong@loong t]$ chmod u-rwx 1.log
[loong@loong t]$ cat 1.log
cat: 1.log: Permission denied
[loong@loong t]$ rm -f 1.log
[loong@loong t]$ ls # 删除成功
|

umask:权限掩码
掩码是用默认权限减去掩码
文件的默认权限是644
目录的默认权限是755,因为目录需要执行权限来允许进入目录、查看和操作目录内容。
默认umask-022
1
2
3
4
5
6
7
8
9
|
umask -p
umask 0022
# 第一位 0:特殊权限位,不常用,一般设为 0。
# 第二位 0:影响文件所有者的权限(不做任何限制)。
# 第三位 2:影响组的权限,禁止写权限。
# 第四位 2:影响其他用户的权限,禁止写权限。
umask -S
u=rwx,g=rx,o=rx
|
特殊权限
SUID:
设置SUID位的主要作用是使普通用户在执行这个文件时,临时获得文件所有者(通常是root)的权限。
- 二进制文件:二进制文件执行后,进程属于文件的所属人,而不是执行的人(无SUID,进程属于执行人)
- 目录:无意义
1
2
3
4
|
# 只有文件的所有者或者root用户可以更改文件的SUID(Set User ID)权限位。
chmod u+s FILE
chmod 4xxx FILE
chmod u-s FILE
|
SGID:
- 二进制文件:执行该文件的用户将以文件所属组的权限来运行它,而不是以用户本身的组权限来运行。
- 目录:使目录下创建的文件的所属组为目录的所属组(而不是创建者的默认组)。
大写的S 表示SGID位已设置,但组用户没有执行权限。这种设置会使SGID没有实际效果,因为没有执行权限。
小写的s 才是设置成功。
1
2
3
|
chmod g+s FILE
chmod 2xxx FILE
chmod g-s FILE
|
STICKY:
具有目录写权限的通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权。
删除文件不仅需要目录的写权限,还需要执行权限,因为删除操作需要“进入”目录并修改其内容。
- 文件:无意义
- 目录:使只有目录下的文件的所属人,目录所有者和root才能删除文件。
1
2
3
|
chmod o+t DIR
chmod 1xxx DIR
chmod o-t DIR
|
目录所有者仍然拥有删除任何文件的权限,就算设置了STICKY,即便文件由其他用户创建。
chatrr:设置文件的特殊属性
Change Attributes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
+attribute
-attribute
=attribute
a # 文件只能追加内容,无法修改或删除已有内容。对于日志文件,这个属性非常有用。可复制,可查看
A # 禁止访问时间更新。访问文件时不更新访问时间。
# 适合减少频繁访问时间更新的文件的I/O负载。
i # 文件无法被修改、删除、重命名,甚至无法创建硬链接。可复制,可查看
# 即使是root用户也不能更改此文件,适合保护关键系统文件。
s # 安全删除属性。当文件被删除时,其数据会被覆盖,防止恢复。
# 这个属性对数据敏感性高的文件较为适用。
u # 可恢复删除属性。删除文件时,系统保留其数据,方便恢复。
lsattr # 显示文件的特殊属性
|
ACL:访问控制列表
ACL生效顺序:
所有者,自定义用户,所属组,自定义组,其他人
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
setfacl FILE|DIR # 可设置ACL权限
getfacl FILE|DIR # 可查看设置的ACL权限
-rw-r--r--+ 1 root root 10 Jun 26 20:19 f1 #有+号
setfacl -m u:noob:- f1.log # noob权限全无
setfacl -m u:noob:rw f1.log # noob:rw
setfacl -m u:noob:r f1.log # noob:r
setfacl -m g:noob:- f1.log # noob组权限全无
setacl f1.log f2.log # f1的acl给f2
getfacl f1 | setfacl --set-file=- f2 # 通过管道
setfacl -x u:noob f1 # 移除某用户acl
setfacl -b f1 # 移除所有acl,恢复为标准的Linux权限
setfacl -k f1 # 清除默认ACL
-rw-r--r--. 1 root root 10 Jun 26 20:19 f1 #无+号
setfacl --set u::rw,u:jerry:-,g::-,o::- f2 # 用新规则替换原有
|
mask
mask 权限,指的是用户或群组能拥有的最大 ACL 权限,也就是说,给用户或群组设定的 ACL 权限不能超过 mask 规定的权限范围,超出部分做无效处理。
-
脚本程序,要有读权限,才能执行。
顺序是
- 读脚本文件
- bash执行,读取代码
-
编译过后二进制文件,没有读权限,也能执行。