最小权限原则(POLP)
POLP principle of least privilege,够用就行,不用多给权限
最小特权原则 (POLP) 重要性
• 减少网络攻击面: 当今,大多数高级攻击都依赖于利用特权凭证(提权)。通过限制超级用户和管理员权限,最小权限执行有助于减少总体网络攻击面。
• 提高安全性 阻止恶意软件的传播: 通过在服务器或者在应用系统上执行最小权限,恶意软件攻击(例如SQL注入攻击)将很难提权来增加访问权限并横向移动破坏其他软件、设备。
• 有助于简化合规性和审核 :许多内部政策和法规要求都要求组织对特权帐户实施最小权限原则,以防止对关键业务系统的恶意破坏。最小权限执行可以帮助组织证明对特权活动的完整审核跟踪的合规性。
在团队中实施最小特权原则 (POLP)
• 在所有服务器、业务系统中,审核整个环境以查找特权帐户(例如SSH账号、管理后台账号、跳板机账号;
• 减少不必要的管理员权限,并确保所有用户和工具执行工作时所需的权限;
• 定期更改管理员账号密码;
• 权限审核 确保所有用户只有能完成本职工作的权限;
• 设置所有用户最低权限,根据需要提权;
• 权限分离,管理员和普通用户;
• 监控管理员账号操作行为,告警通知异常活动.
AppArmor限制容器对资源访问
AppArmor(Application Armor) 是一个 Linux 内核安全模块,可用于限制主机操作系统上运行的进程的功能。每个进程都可以拥有自己的安全配置文件。安全配置文件用来允许或禁止特定功能,例如网络访问、文件读/写/执行权限等。类似selinux
Linux发行版内置:Ubuntu、Debian
Apparmor两种工作模式
• Enforcement(强制模式) :在这种模式下,配置文件里列出的限制条件都会得到执行,并且对于违反这些限制条件的程序会进行日志记录。
• Complain(投诉模式):在这种模式下,配置文件里的限制条件不会得到执行,Apparmor只是对程序的行为进行记录。一般用于调试。
AppArmor限制容器对资源访问
部署 apparmor
1.安装apparmor规则生成工具
apt-get install apparmor-profiles apparmor-utils -y
apparmor 的两种规则模式
1、aa-complain nginx 投诉/学习: 允许并记录配置文件的冲突。对于测试并开发新的配置文件有用途。不需要完全满足规则进程也能运行
2、aa-enforce nginx 强制/受限:强制配置策略及违规记录,需要完全满足规则进程才能运行
常用命令
aa-complain nginx # 使nginx的apparmor模式变更为允许模式
aa-enforce nginx # 使nginx的apparmor模式变更为强制模式
aa-logprof # 添加运行进程本身需要读取的文件权限,自动添加
apparmor_status # 查看已加载的规则
apparmor_parser -q aa-profile.yaml # -q 安装一条规则
apparmor_parser -R aa-profile.yaml # -R 卸载规则
apparmor_parser -r aa-profile.yaml # -r 规则有修改后重新加载
2.配置apparmor规则来控制nginx
cd /etc/apparmor.d/
root@vms81:/etc/apparmor.d# ls /etc/apparmor.d/
abstractions disable local lxc-containers tunables usr.bin.man usr.sbin.rsyslogd
cache force-complain lxc sbin.dhclient usr.bin.lxc-start usr.lib.snapd.snap-confine.real usr.sbin.tcpdump
usr.lib.snapd.snap-confine.real
usr.sbin.tcpdump
apparmor 配置文件命名规则,把daemon路径里的/ 变成点.
这里which nginx ----/usr/sbin/nginx
root@vms81:/etc/apparmor.d# vim usr.sbin.nginx
**规则很繁琐所以要用到apparmor-profiles apparmor-utils**
为nginx 生成规则文件
root@vms70:/etc/apparmor.d# vim usr.sbin.nginx
# Last Modified: Wed May 11 16:13:48 2022
#include <tunables/global>
/usr/sbin/nginx flags=(complain) { # 允许模式
#include <abstractions/base>
**以下定义规则**
/lib/x86_64-linux-gnu/ld-*.so mr,
/usr/sbin/nginx mr,
}
apparmor规则如下
allow /path/ 权限1, **逗号结束**
deny /path2/ 权限2,
/path3/ 权限3, **没有注明allow还是deny 默认是allow**
deny /data/www/unsefe rw, **拒绝对unsefe这个目录可读、可写**
root@vms70:/etc/apparmor.d# aa-enforce nginx
Setting /usr/sbin/nginx to enforce mode.
systemctl restart nginx ---报错 无法重启
Job for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xe" for details.
**journalctl -xe 查询日志**
root@vms70:/etc/apparmor.d# journalctl -xe |grep nginx
May 12 09:56:00 vms70.rhce.cc audit[90539]: AVC apparmor="STATUS" operation="profile_replace" profile="unconfined" name="/usr/sbinnginx" pid=90539 comm="apparmor_parser"
...
规则过多一个个添加容易漏配,所以用 aa-logprof 命令来添加运行nginx本身需要读取的文件权限
**aa-logprof**
root@vms70:/etc/apparmor.d# aa-logprof
Reading log entries from /var/log/syslog.
Updating AppArmor profiles in /etc/apparmor.d.
Enforce-mode changes:
Profile: /usr/sbin/nginx
Capability: dac_override
Severity: 9
[1 - #include <abstractions/lxc/container-base>]
2 - #include <abstractions/lxc/start-container>
3 - capability dac_override,
(A)llow / [(D)eny] / (I)gnore / Audi(t) / Abo(r)t / (F)inish
a----s
root@vms70:/etc/apparmor.d# vim usr.sbin.nginx
# Last Modified: Thu May 12 10:02:57 2022
#include <tunables/global>
/usr/sbin/nginx {
#include <abstractions/base>
#include <abstractions/lxc/container-base> # 新增了这个,加载了一些模块,使得nginx本身正常运行时所需要读取的文件都允许
deny /data/www/unsefe rw,
}
root@vms70:/etc/apparmor.d# systemctl restart nginx # nginx启动正常
k8s中如何使用apparmor
apt-get install apparmor-utils
规则的定义:/etc/apparmor.d
加载的目录:/sys/kernel/security/apparmor/profiles
新增 apparmor 规则
1.配置文件
root@vms82:/etc/apparmor.d# vim aa-profile.yaml
#include <tunables/global>
profile aaprofile flags=(attach_disconnected) { # profile 名字 flags=(attach_disconnected)
#include <abstractions/base>
}
root@vms82:/etc/apparmor.d# apparmor_parser -q aa-profile.yaml
root@vms82:/etc/apparmor.d# apparmor_status |grep aaprofile
aaprofile
2.pod 的yaml文件支持
root@vms81:~/cks# vim pod1.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: web1
name: web1
annotations: # 新增
container.apparmor.security.beta.kubernetes.io/web1: localhost/aaprofile
spec:
containers:
- image: nginx
imagePullPolicy: IfNotPresent
name: web1
resources: {}
command: ["sh","-c","sheep 1h"]
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
详解
annotations: # 新增的
container.apparmor.security.beta.kubernetes.io/web1: localhost/aaprofile
**container.apparmor.security.beta.kubernetes.io/关键词1: 关键词2/关键词3**
**关键词1 要与容器的名字一致,指定某个容器**
**关键词2 指的是运行pod所在的worker下的apparmor规则**
**关键词3 指定容器使用哪个apparmor规则**
此时pod是无法运行的,原因是sleep没有权限
root@vms81:~/cks# kubectl logs web1
sh: 1: sheep: not found
运行的worker上修改apparmor 规则,增加sheep使用权限
apparmor 规则文件明细
# apparmor 规则优先级 拒绝的优先级高于允许的优先级
file, file允许所有文件读写,如果写了file就是允许了所有的读写操作,然后通过deny 来限定特定的文件的读写
allow /** rw, * 通配符,但不匹配/ ** 通配符,可以匹配/
[a-z] 和bash里通配符一样
allow /usr/bin/* rwkix, r --读 w --写 k --锁定 ix --继承执行
** man 5 apparmor.d 可以查看个参数含义**
worker节点操作
root@vms82:/etc/apparmor.d# vim aa-profile.yaml
#include <tunables/global>
profile aaprofile flags=(attach_disconnected) {
#include <abstractions/base>
allow /bin/sleep rwkix,
# file,
}
**重载**
root@vms82:/etc/apparmor.d# apparmor_parser -r aa-profile.yaml
建议用file, 下面deny来配置规则
root@vms82:/etc/apparmor.d# vim aa-profile.yaml
#include <tunables/global>
profile aaprofile flags=(attach_disconnected) {
#include <abstractions/base>
#include <abstractions/lxc/container-base> # 允许进程运行所需要的权限
file,
deny /bin/sleep rwkix,
}