# FsBackup: Restricted Pod Security and read only root FS
Fixed to address: https://issues.redhat.com/browse/OADP-5105
## Node agent pods
There is one flag `disableFsBackup` that allows to turn on and off FsBackup, that affects the `node-agent` deployment:
```yaml=
configuration:
nodeAgent:
enable: true
uploaderType: kopia
velero:
disableFsBackup: false # set to true to disable Fs Backup
```
### Enabled FsBackup
With the Fs Backup, the `node-agent` pod operates with more permissive settings and has additional volumes mounted. To check the settings, get the pod name, in our example it's `node-agent-2qgjm`:
```shell=
$ oc get pods -n openshift-adp
NAME READY STATUS RESTARTS AGE
node-agent-2qgjm 1/1 Running 0 23s
```
* First check is to ensure annotations are correctly representing `SCC` and `seccomp` and the user in the container is `0`
```shell=
$ oc get pod node-agent-2qgjm -n openshift-adp -o json | jq '.metadata.annotations'
{
"openshift.io/scc": "privileged",
"seccomp.security.alpha.kubernetes.io/pod": "unconfined"
}
$ oc get pod node-agent-2qgjm -n openshift-adp -o json | jq '.spec.securityContext'
{
"runAsNonRoot": false,
"runAsUser": 0,
"seccompProfile": {
"type": "Unconfined"
}
}
```
* Second check is to discover volumes mounted, the list should be similar to the one below, with **host-pods**, **host-plugins** and **home-velero** and **tmp** mounted without **readOnly** flag
```shell=
$ oc get pod node-agent-2qgjm -n openshift-adp -o json | jq -r '.spec.containers[].volumeMounts[]'
{
"mountPath": "/host_pods",
"mountPropagation": "HostToContainer",
"name": "host-pods"
}
{
"mountPath": "/var/data/kubelet/plugins",
"mountPropagation": "HostToContainer",
"name": "host-plugins"
}
{
"mountPath": "/scratch",
"name": "scratch"
}
{
"mountPath": "/etc/ssl/certs",
"name": "certs"
}
{
"mountPath": "/var/run/secrets/openshift/serviceaccount",
"name": "bound-sa-token",
"readOnly": true
}
{
"mountPath": "/tmp/credentials",
"name": "credentials"
}
{
"mountPath": "/home/velero",
"name": "home-velero"
}
{
"mountPath": "/tmp",
"name": "tmp"
}
{
"mountPath": "/credentials",
"name": "cloud-credentials"
}
{
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount",
"name": "kube-api-access-vx7j5",
"readOnly": true
}
```
* Third check is to rsh to the running container and ensure the settings are applied:
```shell=
$ oc rsh -n openshift-adp node-agent-2qgjm
sh-5.1# touch /readonly
touch: cannot touch '/readonly': Read-only file system
sh-5.1# whoami
root
sh-5.1# df -h | grep -v tmp # /host_pods should be mounted
Filesystem Size Used Avail Use% Mounted on
overlay 98G 19G 74G 21% /
shm 64M 0 64M 0% /dev/shm
/dev/vda2 98G 19G 74G 21% /host_pods
```
* Once the above settings are confirmed the test should consists of backup/restore operations using FSBackup. It should work as expected.
### Disabled FsBackup
With disabled Fs Backup, the `node-agent` pod operates with more restrictive settings and less volumes mounted. To check the settings, get the pod name, in our example it's `node-agent-2qgjm`:
```shell=
$ oc get pods -n openshift-adp
NAME READY STATUS RESTARTS AGE
node-agent-j7csd 1/1 Running 0 15s
```
* First check is to ensure annotations are correctly representing `SCC` and `seccomp` and the user in the container is not specified. The fsGroup represents the UID of the user. The `runAsNonRoot` is set to `true`.
```shell=
$ oc get pod node-agent-j7csd -n openshift-adp -o json | jq '.metadata.annotations'
{
"openshift.io/scc": "restricted-v2",
"seccomp.security.alpha.kubernetes.io/pod": "runtime/default"
}
$ oc get pod node-agent-j7csd -n openshift-adp -o json | jq '.spec.securityContext'
{
"fsGroup": 1000650000,
"runAsNonRoot": true,
"seLinuxOptions": {
"level": "s0:c26,c0"
},
"seccompProfile": {
"type": "RuntimeDefault"
}
}
```
* Second check is to discover volumes mounted, the list should be similar to the one below, with **home-velero** and **tmp** mounted without **readOnly** flag. Without **host-pods** and **host-plugins**.
```shell=
$ oc get pod node-agent-j7csd -n openshift-adp -o json | jq -r '.spec.containers[].volumeMounts[]'
{
"mountPath": "/scratch",
"name": "scratch"
}
{
"mountPath": "/etc/ssl/certs",
"name": "certs"
}
{
"mountPath": "/var/run/secrets/openshift/serviceaccount",
"name": "bound-sa-token",
"readOnly": true
}
{
"mountPath": "/tmp/credentials",
"name": "credentials"
}
{
"mountPath": "/home/velero",
"name": "home-velero"
}
{
"mountPath": "/tmp",
"name": "tmp"
}
{
"mountPath": "/credentials",
"name": "cloud-credentials"
}
{
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount",
"name": "kube-api-access-gxvxt",
"readOnly": true
}
```
* Third check is to rsh to the running container and ensure the settings are applied:
```shell=
$ oc rsh -n openshift-adp node-agent-j7csd
sh-5.1# touch /readonly
touch: cannot touch '/readonly': Read-only file system
sh-5.1# whoami
1000650000
sh-5.1# df -h | grep -v tmp # /host_pods should be NOT be mounted
Filesystem Size Used Avail Use% Mounted on
overlay 98G 19G 74G 21% /
shm 64M 0 64M 0% /dev/shm
```
* Once the above settings are confirmed the test should consists of backup/restore operations using FsBackup. The backup and restore using FSBackup should **FAIL**.