# securityContext
## 驗證 allowPrivilegeEscalation
* 它可以防止 container 內的子程序獲得比其父程序更多的權限
```
$ echo 'apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: test
name: test
spec:
replicas: 1
selector:
matchLabels:
app: test
template:
metadata:
labels:
app: test
spec:
securityContext: # 這邊是全域宣告,代表這裡有多少 container 都會宣告這個設定
runAsUser: 1000
containers:
- image: quay.io/cloudwalker/alp.kadm
name: test
tty: true
securityContext:
allowPrivilegeEscalation: false' | kubectl apply -f -
$ kubectl get po
NAME READY STATUS RESTARTS AGE
test-6b77d94ff4-bd8vs 1/1 Running 0 119s
$ kubectl exec -it test-6b77d94ff4-bd8vs -- bash
$ whoami
bigred
# 不允許使用者以 sudo 身分執行任何命令
$ sudo touch /test
sudo: The "no new privileges" flag is set, which prevents sudo from running as root.
sudo: If sudo is running in a container, you may need to adjust the container configuration to disable the flag.
$ sudo su
sudo: The "no new privileges" flag is set, which prevents sudo from running as root.
sudo: If sudo is running in a container, you may need to adjust the container configuration to disable the flag.
```
## privileged
* 先建立 `privileged: true` 權限的 pod
```
$ echo 'apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: test
name: test
spec:
replicas: 1
selector:
matchLabels:
app: test
template:
metadata:
labels:
app: test
spec:
securityContext:
runAsUser: 1000
containers:
- image: quay.io/cloudwalker/alp.kadm
name: test
tty: true
securityContext:
privileged: true' | kubectl apply -f -
```
```
$ kubectl get po
NAME READY STATUS RESTARTS AGE
test-7665f7bc97-j92t4 1/1 Running 0 39s
$ kubectl exec -it test-7665f7bc97-j92t4 -- bash
```
* 檢查目前有哪些能力
```
$ capsh --print
Current: =
Bounding set =cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,cap_audit_read,cap_perfmon,cap_bpf,cap_checkpoint_restore
Ambient set =
Current IAB:
Securebits: 00/0x0/1'b0 (no-new-privs=0)
secure-noroot: no (unlocked)
secure-no-suid-fixup: no (unlocked)
secure-keep-caps: no (unlocked)
secure-no-ambient-raise: no (unlocked)
uid=1000(bigred) euid=1000(bigred)
gid=10(wheel)
groups=10(wheel)
Guessed mode: HYBRID (4)
```
* 改改權限 `privileged: false`
```
$ echo 'apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: test
name: test
spec:
replicas: 1
selector:
matchLabels:
app: test
template:
metadata:
labels:
app: test
spec:
securityContext:
runAsUser: 1000
containers:
- image: quay.io/cloudwalker/alp.kadm
name: test
tty: true
securityContext:
privileged: false' | kubectl apply -f -
```
```
$ kubectl get po
NAME READY STATUS RESTARTS AGE
test-5d7886bdb6-jx858 1/1 Running 0 40s
$ kubectl exec -it test-5d7886bdb6-jx858 -- bash
```
* 此時檢查已經被拿掉非常多的 capabilities
```
# Current IAB 以下這些有有驚嘆號代表都是不可用的 capabilities
$ capsh --print
Current: =
Bounding set =cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap
Ambient set =
Current IAB: !cap_dac_read_search,!cap_linux_immutable,!cap_net_broadcast,!cap_net_admin,!cap_ipc_lock,!cap_ipc_owner,!cap_sys_module,!cap_sys_rawio,!cap_sys_ptrace,!cap_sys_pacct,!cap_sys_admin,!cap_sys_boot,!cap_sys_nice,!cap_sys_resource,!cap_sys_time,!cap_sys_tty_config,!cap_lease,!cap_audit_control,!cap_mac_override,!cap_mac_admin,!cap_syslog,!cap_wake_alarm,!cap_block_suspend,!cap_audit_read,!cap_perfmon,!cap_bpf,!cap_checkpoint_restore
Securebits: 00/0x0/1'b0 (no-new-privs=0)
secure-noroot: no (unlocked)
secure-no-suid-fixup: no (unlocked)
secure-keep-caps: no (unlocked)
secure-no-ambient-raise: no (unlocked)
uid=1000(bigred) euid=1000(bigred)
gid=10(wheel)
groups=10(wheel)
Guessed mode: HYBRID (4)
```
## 示範拿掉所有 capabilities 且無法使用 sudo 提權
```
$ echo 'apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: test
name: test
spec:
replicas: 1
selector:
matchLabels:
app: test
template:
metadata:
labels:
app: test
spec:
securityContext:
runAsUser: 1000
containers:
- image: quay.io/cloudwalker/alp.kadm
name: test
tty: true
securityContext:
privileged: false
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL' | kubectl apply -f -
```
```
$ kubectl get po
NAME READY STATUS RESTARTS AGE
test-54b45668df-2nn97 1/1 Running 0 48s
$ kubectl exec -it test-54b45668df-2nn97 -- bash
```
```
$ capsh --print
Current: =
Bounding set =
Ambient set =
Current IAB: !cap_chown,!cap_dac_override,!cap_dac_read_search,!cap_fowner,!cap_fsetid,!cap_kill,!cap_setgid,!cap_setuid,!cap_setpcap,!cap_linux_immutable,!cap_net_bind_service,!cap_net_broadcast,!cap_net_admin,!cap_net_raw,!cap_ipc_lock,!cap_ipc_owner,!cap_sys_module,!cap_sys_rawio,!cap_sys_chroot,!cap_sys_ptrace,!cap_sys_pacct,!cap_sys_admin,!cap_sys_boot,!cap_sys_nice,!cap_sys_resource,!cap_sys_time,!cap_sys_tty_config,!cap_mknod,!cap_lease,!cap_audit_write,!cap_audit_control,!cap_setfcap,!cap_mac_override,!cap_mac_admin,!cap_syslog,!cap_wake_alarm,!cap_block_suspend,!cap_audit_read,!cap_perfmon,!cap_bpf,!cap_checkpoint_restore
Securebits: 00/0x0/1'b0 (no-new-privs=1)
secure-noroot: no (unlocked)
secure-no-suid-fixup: no (unlocked)
secure-keep-caps: no (unlocked)
secure-no-ambient-raise: no (unlocked)
uid=1000(bigred) euid=1000(bigred)
gid=10(wheel)
groups=10(wheel)
Guessed mode: HYBRID (4)
$ sudo su
sudo: The "no new privileges" flag is set, which prevents sudo from running as root.
sudo: If sudo is running in a container, you may need to adjust the container configuration to disable the flag.
```
## 參考文件
https://www.golinuxcloud.com/kubernetes-privileged-pod-examples/