shell 脚本编程
set -eou pipefail 是一种在 bash 脚本中常用的设置,用于增强脚本的健壮性,它的作用如下:
-
set -e:在执行时,如果一个命令非零退出,那么整个脚本就会立即退出。 -
set -o pipefail:在管道连接的命令中,如果任何一个命令失败(返回非零值),整个管道命令就会失败,而不是只有最后一个命令的成功与否决定最终是否成功。 -
set -u:在执行时,如果脚本涉及到未定义的变量,那么整个脚本就会立即退出。
这样的设置让你的脚本在遇到错误时更早的发现并退出,而不是继续执行可能产生错误结果的后续命令,增加了脚本的健壮性。
在Linux系统中,adduser 和 addgroup 命令用于创建新的用户和组。-S 参数在这里的作用是创建一个系统用户或系统组。
一般而言,系统用户和组主要用于运行系统服务,而不是登录和进行常规的交互操作。例如,你可能会看到运行Web服务器的用户,或者运行数据库服务的用户,等等。这些用户通常不需要有它们自己的主目录,也不需要登录shell。
因此,-S 参数在这里的作用是创建一个新的系统用户 flowable 和一个新的系统组 flowable,而不是创建一个常规的用户或组。
在 Dockerfile 中给用户添加 sudo 权限的同时,为了考虑容器逃逸的安全性,你可以考虑以下设置:
-
限制 sudo 权限:不是所有的 sudo 权限都需要给予用户。你可以在
/etc/sudoers文件中为特定的用户或用户组指定特定的命令。例如,如果你想让用户只能运行apt-get命令,你可以添加一行像这样的配置:flowable ALL=(ALL:ALL) NOPASSWD: /usr/bin/apt-get -
使用最少权限原则:只给予用户完成其工作所需的最少权限。例如,如果用户只需要读取某个文件,就没有必要给予其写入权限。
-
使用用户命名空间:Docker 支持使用用户命名空间,这可以隔离容器的用户 ID,使得容器内的 root 用户在容器外部并不具有 root 权限。
-
禁止特权容器:特权容器可以访问主机的所有设备,并且容器的用户可以获取主机的 root 用户权限。因此,应尽量避免使用特权容器。
-
定期审计和更新:定期审计你的 Dockerfile 和容器设置,确保他们都是最新的,并且已经应用了所有的安全更新和补丁。
这些都是可以帮助你在给予用户 sudo 权限的同时,保护你的容器不受容器逃逸攻击的方法。
特权容器是一种拥有主机上所有的能力和权限的容器。它可以访问主机的所有设备,并且可以做一些系统级别的操作,如更改系统设置或控制其他进程等。特权容器可以让你在没有完全的主机权限的情况下做一些需要系统级别权限的操作,但是也因此增加了安全风险。
如果你想禁止特权容器,可以在Docker的daemon.json文件中设置"default-ulimits": {"nofile": {"Name": "nofile", "Hard": 20000, "Soft": 20000}}。这样,Docker就会默认禁止所有的特权容器。你也可以在启动容器的时候加上--privileged=false参数来禁止特权容器。
在Kubernetes中,你可以通过PodSecurityPolicy来禁止特权容器。你只需要创建一个PodSecurityPolicy,并在其中设置privileged: false。然后,你可以将这个PodSecurityPolicy应用到你的集群,这样你的集群就会禁止所有的特权容器。
在自动化运维场景中,对特权容器的使用需要谨慎。因为它们具有很高的权限,可能会带来安全风险。
首先,尽可能避免使用特权容器。尽管特权容器可以为运维带来便利,但大部分情况下,我们可以通过其他方式达到同样的目的,而无需使用特权容器。
其次,如果必须使用特权容器,那么需要确保它们的使用是受控的。例如,可以使用Kubernetes的PodSecurityPolicy来限制哪些用户或者哪些Namespace可以使用特权容器。
此外,还需要定期审计特权容器的使用情况,确保它们不会被滥用。如果发现有特权容器被滥用,那么需要立即采取行动,例如停止滥用的容器,或者限制滥用者的权限。
最后,可以使用一些安全工具来增加对特权容器的保护。例如,可以使用SELinux或者AppArmor来限制特权容器的权限,或者使用Seccomp来限制特权容器可以调用的系统调用。
在Docker中,如果需要禁止特权容器的使用,可以在Docker的配置文件(/etc/docker/daemon.json)中添加以下配置:
{
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 65536,
"Soft": 65536
}
}
}
保存文件后,重启Docker服务,新的配置就会生效。
在Kubernetes中,如果需要禁止特权容器的使用,可以创建以下的PodSecurityPolicy:
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: no-privileged
spec:
privileged: false # 禁止特权容器
# 其他的安全设置...
创建完PodSecurityPolicy后,还需要将其绑定到相应的用户或者ServiceAccount。例如,以下的ClusterRole和ClusterRoleBinding将上面的PodSecurityPolicy绑定到了所有用户和ServiceAccount:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: psp:no-privileged
rules:
- apiGroups:
- policy
resources:
- podsecuritypolicies
resourceNames:
- no-privileged
verbs:
- use
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: all:psp:no-privileged
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: psp:no-privileged
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: system:authenticated
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: system:unauthenticated
这样,所有的用户和ServiceAccount都将被禁止使用特权容器。