01-系统安全
- 1.权限
- 一.文件权限
- 二.用户授权
- 2.认证
- 一.用户认证
- 二.PAM常用模块讲解
- 3.扩展
- 一.Cgroup
1.权限
一.文件权限
文件权限已在之前博客中记录
只做一个扩展
chattr:
有多种属性,这里只介绍两种常用属性
a属性
[root@vm1 ~]# touch a.txt
[root@vm1 ~]# chattr +a a.txt
# 此属性使文件只能添加不能删除,且添加方式只能为追加
[root@vm1 ~]# echo 123 > a.txt
-bash: a.txt: Operation not permitted
[root@vm1 ~]# echo 123 >> a.txt
[root@vm1 ~]# rm -rf a.txt
rm: cannot remove 'a.txt': Operation not permitted
[root@vm1 ~]# lsattr a.txt # 查看文件属性
-----a-------------- a.txt
[root@vm1 ~]# chattr -a a.txt
# 去除文件属性
[root@vm1 ~]# lsattr a.txt
-------------------- a.txt
i属性
[root@vm1 ~]# touch b.txt
[root@vm1 ~]# chattr +i b.txt
# 此属性使文件不能删除,不能更改,不能移动
[root@vm1 ~]# echo 123 >> b.txt
-bash: b.txt: Operation not permitted
[root@vm1 ~]# rm -rf b.txt
rm: cannot remove 'b.txt': Operation not permitted
[root@vm1 ~]# mv b.txt c.txt
mv: cannot move 'b.txt' to 'c.txt': Operation not permitted
[root@vm1 ~]# lsattr b.txt
----i--------------- b.txt
[root@vm1 ~]# chattr -i b.txt
[root@vm1 ~]# lsattr b.txt
-------------------- b.txt
二.用户授权
su命令切换用户
[root@vm1 ~]# su test1
[test1@vm1 root]$ exit
exit
[root@vm1 ~]# su - test1
Last login: Tue Oct 5 01:35:40 CST 2021 on pts/0
[test1@vm1 ~]$
两者区别
不加-:环境变量不发生改变
加-:环境变量发生改变,切换到test1的环境变量
sudo命令给普通用户提升权限
[test1@vm1 ~]$ tail /etc/shadow
tail: cannot open '/etc/shadow' for reading: Permission denied
[test1@vm1 ~]$ sudo tail /etc/shadow
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for test1:
test1 is not in the sudoers file. This incident will be reported.
# 意为"test1不在sudoers文件中。这一事件将被报道。"
# 无法提权,因为配置文件里没有写此用户的权限
更改sudo配置文件
[root@vm1 ~]# visudo /etc/sudoers
#user MACHING=(RUN_AS_USER) COMMANDS
# 在文件最后新建一行添加如下内容
test1 ALL=(ALL) NOPASSWD:/usr/bin/tail /etc/shadow
# 意为"允许test1用户 在任何主机上=(以任何人的身份)
# 不用密码执行/usr/bin/tail /etc/shadow"
保存退出
[root@vm1 ~]# su - test1
Last login: Tue Oct 5 01:45:58 CST 2021 on pts/0
[test1@vm1 ~]$ sudo tail /etc/shadow
dbus:!!:18873::::::
systemd-coredump:!!:18873::::::
systemd-resolve:!!:18873::::::
tss:!!:18873::::::
polkitd:!!:18873::::::
unbound:!!:18873::::::
sssd:!!:18873::::::
sshd:!!:18873::::::
rngd:!!:18873::::::
test1:$6$odZbgwbCPxZwAMHf$OsQEPm4gTnlKglVes2.N6tpWNC5CD09B0UZga0g/1w5JStaqKOWICIVP0UlozjdsKb.P8JJdvyiGe.pE/HcZO.:18904:0:99999:7:::
如果想要对组提升权限,在user列写上组名,前面加上"%"即可
[root@vm1 ~]# groupadd group1
[root@vm1 ~]# useradd gtest1
[root@vm1 ~]# useradd gtest2
[root@vm1 ~]# usermod gtest1 -G group1
[root@vm1 ~]# usermod gtest2 -G group1
[root@vm1 ~]# visudo /etc/sudoers
# 文件最后新建一行添加如下内容
%group1 ALL=(ALL) NOPASSWD:/usr/bin/tail /etc/shadow
保存退出
[root@vm1 ~]# su - gtest1
Last login: Tue Oct 5 01:52:57 CST 2021 on pts/0
[gtest1@vm1 ~]$ tail /etc/shadow
tail: cannot open '/etc/shadow' for reading: Permission denied
[gtest1@vm1 ~]$ sudo tail /etc/shadow
...
[gtest1@vm1 ~]$ exit
logout
[root@vm1 ~]# su - gtest2
Last login: Tue Oct 5 01:51:34 CST 2021 on pts/0
[gtest2@vm1 ~]$ tail /etc/shadow
tail: cannot open '/etc/shadow' for reading: Permission denied
[gtest2@vm1 ~]$ sudo tail /etc/shadow
...
要禁止用户的某项权限,可以在COMMANDS前加上一个!
[root@vm1 ~]# visudo /etc/sudoers
# 在文件最后新建一行添加如下内容
test1 ALL=(ALL) NOPASSWD:!/usr/bin/passwd root
保存退出
[root@vm1 ~]# su - test1
Last login: Tue Oct 5 17:46:54 CST 2021 on pts/0
[test1@vm1 ~]$ sudo passwd root
Sorry, user test1 is not allowed to execute '/bin/passwd root' as root on vm1.
查看sudo日志
[root@vm1 ~]$ grep '^authpriv' /etc/rsyslog.conf
authpriv.* /var/log/secure
[root@vm1 ~]# tail /var/log/secure
...
2.认证
一.用户认证
PAM(gdm,kdm,su,ssh,ftp,samba)
自带数据库验证方式(MySQL,Zabbix)
web验证方式(htpasswd)
集中式身份认证
PAM介绍:
PAM(Pluggable Authentication Modules) 即可插拔式认证模块,它是一种高效而且灵活的用户级别的认证方式,它
也是当前Linux服务器普遍使用的认证方式。
PAM可以根据用户的网段、时间、用户名、密码等实现认证。
查看PAM帮助
[root@vm1 ~]# man pam
...
[root@vm1 ~]# vim /usr/share/doc/pam/Linux-PAM_SAG.txt
[root@vm1 ~]# firefox /usr/share/doc/pam/html/Linux-PAM_SAG.html
# 如果装了图形,可以使用火狐浏览器打开html页面
PAM认证原理
Service(进程文件) → PAM(配置文件) → pam_*.so → 模块的配置文件
/usr/sbin/sshd
/etc/pam.d/sshd
/lib64/security/pam_access.so
/etc/security/access.conf
PAM常见四种认证类型
auth 认证管理 验证使用者身份,账号和密码
account 用户管理 基于用户时间或密码有效期来决定是否允许访问
password 密码(口令) 认证管理 禁止用户反复尝试登录,在变更密码时进行密码复杂性控制
session 会话管理 进行日志记录,或者限制用户登录的次数,资源限制
PAM认证流程控制(流程标记)
Required (必要条件) 验证失败时仍然继续,但返回fail 用户不会知道哪里失败
Requisite (必要条件) 验证失败时则立即结束整个验证过程,返回fail 面试若不成功,马上失败,效率高
Sufficient (充分条件) 验证成功则立即返回,不再继续,否则忽略结果并继续 相当于面试中的拔高题
Optional (可选条件) 无论验证结果如何,均不会影响 常用于session类型
Include 包含另外一个配置文件中类型相同的行
substack 垂直叠加
二.PAM常用模块讲解
pam_rootok.so模块
功能:用户UID是0,返回成功
[root@vm1 ~]# su - test1
Last login: Tue Oct 5 17:47:30 CST 2021 on pts/0
[test1@vm1 ~]$ exit
logout
# 原先root切换为别的用户不需要输入密码
[root@vm1 ~]# vim /etc/pam.d/su
# 注释掉如下一行
auth sufficient pam_rootok.so
#auth sufficient pam_rootok.so
保存退出
[root@vm1 ~]# su - test1
Password: #输入test1的密码
Last login: Tue Oct 5 18:20:27 CST 2021 on pts/0
[test1@vm1 ~]$ exit
logout
[root@vm1 ~]#
# 实验环境更改完配置要做其他实验记得改回来
pam_access.so模块
功能:访问控制,默认配置文件/etc/security/access.conf
[root@vm2 ~]# ssh 172.20.203.10
Last login: Tue Oct 5 17:42:50 2021 from 172.20.20.23
[root@vm1 ~]#
[root@vm1 ~]# exit
logout
Connection to 172.20.203.10 closed.
[root@vm2 ~]#
# 测试成功,可以连接
# 接下来在vm1上配置访问控制
[root@vm1 ~]# vim /etc/pam.d/sshd
# 因为文件是自上而下解析的,所以需要在文件开头新建一行,添加以下内容
auth required pam_access.so
# 添加一个模块
保存退出
[root@vm1 ~]# vim /etc/security/access.conf # 更改配置文件
# 在文件最后新建一行,添加如下内容
-:root:172.20.203.11
# 意为"不允许172.20.203.11访问"
保存退出
# vm2切换为test1用户
[test1@vm2 ~]$ ssh root@172.20.203.10
root@172.20.203.10's password:
Permission denied, please try again.
root@172.20.203.10's password:
Permission denied, please try again.
root@172.20.203.10's password:
root@172.20.203.10: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password). # '
# 访问被拒绝
# 要设置允许改"-"为"+"即可
[root@vm1 ~]# vim /etc/security/access.conf
+:root:172.20.203.11
保存退出
[test1@vm2 ~]$ ssh root@172.20.203.10
root@172.20.203.10's password:
Last failed login: Tue Oct 5 18:39:40 CST 2021 from 172.20.203.11 on ssh:notty
There was 1 failed login attempt since the last successful login.
Last login: Tue Oct 5 18:39:32 2021 from 172.20.203.11 #'
[root@vm1 ~]#
[root@vm1 ~]# exit
logout
Connection to 172.20.203.10 closed.
[test1@vm2 ~]$
模块使用自定义配置文件
[root@vm1 ~]# vim /etc/pam.d/sshd
# 文件开头更改为
auth required pam_access.so accessfile=/test1
保存退出
[root@vm1 ~]# vim /test1
-:root:172.20.203.11
保存退出
# vm2登录vm1
[test1@vm2 ~]$ ssh root@172.20.203.10
root@172.20.203.10's password:
Permission denied, please try again.
root@172.20.203.10's password:
Permission denied, please try again.
root@172.20.203.10's password:
root@172.20.203.10: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password). #'
[test1@vm2 ~]$
# vm1修改配置文件
[root@vm1 ~]# vim /test1
+:root:172.20.203.11
保存退出
# vm2登录vm1
[test1@vm2 ~]$ ssh root@172.20.203.10
root@172.20.203.10's password:
Last failed login: Tue Oct 5 18:46:07 CST 2021 from 172.20.203.11 on ssh:notty
There were 5 failed login attempts since the last successful login.
Last login: Tue Oct 5 18:40:49 2021 from 172.20.203.11 #'
[root@vm1 ~]# exit
logout
Connection to 172.20.203.10 closed.
[test1@vm2 ~]$
pam_listfile.so模块
功能:基于自定义文件允许或拒绝(白名单或黑名单)
[root@vm1 ~]# man pam_listfile
# 查看帮助文档
[root@vm1 ~]# dnf -y install vsftpd
[root@vm1 ~]# vim /etc/vsftpd/vsftpd.conf
# 修改NO为YES
anonymous_enable=YES
# 意为允许匿名用户
保存退出
[root@vm1 ~]# systemctl restart vsftpd
# vm2测试登录vm1ftp
[root@vm2 ~]# ftp 172.20.203.10
Connected to 172.20.203.10 (172.20.203.10).
220 (vsFTPd 3.0.3)
Name (172.20.203.10:root): test1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> exit
221 Goodbye.
[root@vm2 ~]#
# 切换为vm1
[root@vm1 ~]# vim /etc/pam.d/vsftpd
# 在"session optional pam_keyinit.so force revoke"下新建一行添加如下内容
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
# 意为阻止/etc/vsftpd/ftpusers中的用户登录
[root@vm1 ~]# vim /etc/vsftpd/ftpusers
# 在文件最后新建一行添加如下内容
test1
# 添加test1用户
保存退出
# vm2登录vm1ftp
[root@vm2 ~]# ftp 172.20.203.10
Connected to 172.20.203.10 (172.20.203.10).
220 (vsFTPd 3.0.3)
Name (172.20.203.10:root): test1
331 Please specify the password.
Password:
530 Login incorrect.
Login failed.
ftp> exit
221 Goodbye.
[root@vm2 ~]#
pam_time.so模块
功能:基于时间的访问控制,默认配置文件vim /etc/security/time.conf
[root@vm1 ~]# man pam_time
# 查看帮助文档
[root@vm1 ~]# vim /etc/pam.d/sshd
# 文件开头新建一行添加如下内容
account required pam_time.so
保存退出
[root@vm1 ~]# vim /etc/security/time.conf
# 文件最后新建一行添加
sshd;*;*;MoTuWeThFr0800-1100
# 意为"允许在周一至周五的8点到11点登录"
[root@vm1 ~]# date # 查看vm1当前时间
Tue Oct 5 19:21:57 CST 2021
# vm2测试登录vm1
[test1@vm2 ~]$ ssh root@172.20.203.10
root@172.20.203.10's password:
Connection closed by 172.20.203.10 port 22 #'
# 修改vm1系统时间
[root@vm1 ~]# date -s "2021-10-05 09:25:30"
Tue Oct 5 09:25:30 CST 2021
# vm2测试登录vm1
[test1@vm2 ~]$ ssh root@172.20.203.10
root@172.20.203.10's password:
Last failed login: Tue Oct 5 19:21:41 CST 2021 from 172.20.203.11 on ssh:notty
There was 1 failed login attempt since the last successful login.
Last login: Tue Oct 5 18:49:55 2021 from 172.20.203.11 #'
[root@vm1 ~]# exit
logout
Connection to 172.20.203.10 closed.
[test1@vm2 ~]$
pam_tally2.so模块
功能:登录统计
用处:可以防止对sshd的暴力破解
[root@vm1 ~]# vim /etc/pam.d/sshd # 修改配置文件
auth required pam_tally2.so deny=2 even_deny_root root_unlock_time=60 unlock_time=60
#deny=2 连续错误登录最大次数,超过最大次数,将被锁定
#even_deny_root root用户也被要求锁定
#root_unlock_time root用户被锁定后等待的时间,单为秒
#unlock_time 普通用户被锁定后等待的时间,单为秒
# 意为"如果连续两次登录错误,root和普通用户被锁定"
保存退出
pam_limits.so模块
功能:限制系统资源
因为后文扩展中的Cgroup更优秀,因此不做介绍
3.扩展
一.Cgroup
Control Group(CGroup)资源限制组
控制组(CGroups)是Linux内核的一个特性,主要用来对共享资源进行隔离、限制、审计等。只有能控制分配到容
器的资源,才能避免多个容器同时运行时对宿主机系统的资源竞争。控制组可以提供对容器的内存、CPU、磁盘IO等
资源进行限制和计费管理。控制组的设计目标是为不同的应用情况提供统一的接口,从控制单一进程(比如nice工
具)到系统级虚拟化(包括OpenVZ、Linux-VServer、LXC等)。
具体来看,控制组提供:
资源限制(Resource limiting):可以将组设置为不超过设定的内存限制。比如:内存子系统可以为进程组设定一个
内存使用上限,一旦进程组使用的内存达到限额再申请内存,就会出发Out of Memory警告。 优先级
(Prioritization):通过优先级让一些组优先得到更多的CPU等资源。 资源审计(Accounting):用来统计系统实
际上把多少资源用到适合的目的上,可以使用cpuacct子系统记录某个进程组使用的CPU时间。 隔离(isolation):
为组隔离命名空间,这样一个组不会看到另一个组的进程、网络连接和文件系统。 控制(Control):挂起、恢复和
重启动等操作。
cgroups: Control Groups 基于进程的限制,而非用户,因此对于超户运行的进程也是一样
cgroup将各种子系统定义为资源,命名为controller: 可配额/可度量 - Control Groups (cgroups)
cgroups实现了对资源的配额和度量九大子系统的资源
- blkio 限制每个块设备的输入输出控制。例如:磁盘,光盘以及usb
- cpu 限制使用cpu比例
- cpuacct 产生cgroup任务的cpu资源报告。
- cpuset 多核心的cpu时为cgroup任务分配单独的cpu和内存
- devices 允许或拒绝对设备的访问。
- freezer 暂停和恢复cgroup任务。
- memory 设置内存限制以及产生内存资源报告。
- net_cls 标记每个网络包。
- ns 名称空间子系统
例如:对某个进程使用内存进行限制步骤: - 需要在controller memory下建立cgroup,如nginx_mem控制组,并针对该控制组nginx_mem设置相应的内存
限制参数 - 将进程Nginx分配到 memory controller的控制组(nginx_mem),没有使用controller则不会限制。
[root@localhost ~]# vim /etc/security/limits.conf jack hard cpu 1 12
Cgroup实现资源限制的方法:
a. cgexec 手动分配 b. cgred 自动分配
Cgroup部署
[root@vm1 ~]# dnf -y install libcgroup*
[root@vm1 ~]# systemctl start cgconfig
[root@vm1 ~]# man cgconfig.conf # 查看帮助文档
Cgroup限制进程使用CPU
[root@vm1 ~]# vim /etc/cgconfig.conf
# 文件最后新建一行添加如下内容
group lesscpu {
cpu {
cpu.shares=200;
}
}
group morecpu {
cpu {
cpu.shares=800;
}
}
# 限制lesscpu的使用率为20%,限制morecpu的使用率为80%
保存退出
[root@vm1 ~]# systemctl restart cgconfig
[root@vm1 ~]# lscpu |grep "^CPU(s)"
CPU(s): 4
# 为了保证实验的准确性,只留一个cpu在线
[root@vm1 ~]# echo 1 > /sys/devices/system/cpu/cpu0/online
[root@vm1 ~]# echo 0 > /sys/devices/system/cpu/cpu1/online
[root@vm1 ~]# echo 0 > /sys/devices/system/cpu/cpu2/online
[root@vm1 ~]# echo 0 > /sys/devices/system/cpu/cpu3/online
# 手动分配
[root@vm1 ~]# nohup cgexec -g cpu:lesscpu sha1sum /dev/zero &
[1] 14598
[root@vm1 ~]# nohup: ignoring input and appending output to 'nohup.out'
[root@vm1 ~]# nohup cgexec -g cpu:morecpu md5sum /dev/zero &
[2] 14599
[root@vm1 ~]# nohup: ignoring input and appending output to 'nohup.out'
[root@vm1 ~]# top
...
可以看到两者cpu占用率在80%和20%上下徘徊
实验完后记得删除进程并恢复环境
[root@vm1 ~]# ps
PID TTY TIME CMD
1453 pts/0 00:00:00 bash
14598 pts/0 00:00:25 sha1sum
14599 pts/0 00:01:23 md5sum
14602 pts/0 00:00:00 ps
[root@vm1 ~]# kill 14598
[root@vm1 ~]# kill 14599
[1]- Terminated nohup cgexec -g cpu:lesscpu sha1sum /dev/zero
[root@vm1 ~]# ps
PID TTY TIME CMD
1453 pts/0 00:00:00 bash
14603 pts/0 00:00:00 ps
[2]+ Terminated nohup cgexec -g cpu:morecpu md5sum /dev/zero
[root@vm1 ~]# ps
PID TTY TIME CMD
1453 pts/0 00:00:00 bash
14604 pts/0 00:00:00 ps
[root@vm1 ~]# echo 1 > /sys/devices/system/cpu/cpu1/online
[root@vm1 ~]# echo 1 > /sys/devices/system/cpu/cpu2/online
[root@vm1 ~]# echo 1 > /sys/devices/system/cpu/cpu3/online
Cgroup限制进程使用Memory
[root@vm1 ~]# vim /etc/cgconfig.conf
group poormem{
memory{
memory.limit_in_bytes=268435465; //物理内存限制256M
memory.memsw.limit_in_bytes=268435465; //总内存限制,物理+SWAP
}
}
保存退出