User Guide ​

Configuration ​

The safeguard configuration file is a YAML file that contains key:value or key:[value list] pairs.

Configuration Items ​

Configuration ItemTypeDescription
networkListRule for network restrictions.
filesListRule for file access restrictions.
processListRule for process restrictions.
mountListRule for mount restrictions.
dns_proxyListDNS proxy configurations.
logList containing the following sub-keys:
  • format: [json|text]
  • output: <path>
  • max_size: Maximum size to rotate (MB). Default: 100MB
  • max_age: Period for which logs are kept. Default: 365
  • labels: Key/Value to be added to the log.
  • Log configuration.

    Network ​

    Configuration ItemTypeDescription
    enableEnum with the following possible values: true, falseWhether to enable restrictions or not. Default is true.
    modeEnum with the following possible values: monitor, blockIf monitor is specified, events are only logged. If block is specified, network access is blocked.
    targetEnum with the following possible values: host, containerSelecting host will apply the restriction to hosts. Selecting container will apply the restriction only to containers.
    cidrList containing the following sub-keys:
  • allow: [cidr list]
  • deny: [cidr list]
  • Allow or deny CIDRs.
    domainList containing the following sub-keys:
  • allow: [domain list]
  • deny: [domain list]
  • Allow or deny domains.
    commandList containing the following sub-keys:
  • allow: [command list]
  • deny: [command list]
  • Allow or deny commands.
    uidList containing the following sub-keys:
  • allow: [uid list]
  • deny: [uid list]
  • Allow or deny UIDs.
    gidList containing the following sub-keys:
  • allow: [gid list]
  • deny: [gid list]
  • Allow or deny GIDs.

    Examples ​

    Allowing All Network Connections ​

    Allow all network communications and monitor their connections.

    yaml
    network:
      mode: monitor
      target: host
      cidr:
        allow: ['0.0.0.0/0']

    Blocking Specified Private Networks ​

    Block access to 192.168.1.1/24 and 10.0.1.1/24.

    yaml
    network:
      mode: block
      target: host
      cidr:
        allow: ['0.0.0.0/0']
        deny:
          - 192.168.1.1/24
          - 10.0.1.1/24

    Blocking Metadata Service API ​

    Block access to the public cloud Metadata Service. This is a mitigation measure against SSRF, etc.

    yaml
    network:
      mode: block
      target: host
      cidr:
        allow: ['0.0.0.0/0']
        deny:
          - 169.254.169.254/32

    Blocking Connections to a Specified Domain ​

    Block connections to example.com. safeguard periodically looks up IP addresses to keep up with IP address changes.

    yaml
    network:
      mode: block
      target: host
      cidr:
        allow: ['0.0.0.0/0']
      domain:
        deny:
          - example.com

    Blocking Network Connections of Containers ​

    Allow communication from hosts, but block communication from containers.

    yaml
    network:
      mode: block
      target: container
      cidr:
        allow: ['0.0.0.0/0']
      domain:
        deny:
        - example.com

    !!! example

    shell
    vagrant@ubuntu-impish:~$ curl -I https://example.com
    HTTP/2 200
    
    vagrant@ubuntu-impish:~$ sudo docker run --rm -it curlimages/curl https://example.com
    curl: (7) Couldn't connect to server

    Blocking All Connections from cURL ​

    yaml
    network:
      mode: monitor
      target: container
      cidr:
        allow: ['0.0.0.0/0']
      command:
        deny: ['curl']

    !!! example

    shell
    vagrant@ubuntu-impish:~$ curl -I https://example.com
    curl: (6) Could not resolve host: example.com
    
    vagrant@ubuntu-impish:~$ wget https://example.com -O /dev/null
    --2022-03-09 14:45:11--  http://example.com/
    Resolving example.com (example.com)... 93.184.216.34
    Connecting to example.com (example.com)|93.184.216.34|:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 1256 (1.2K) [text/html]
    Saving to: '/dev/null'
    
    /dev/null               100%[============================>]   1.23K  --.-KB/s    in 0s
    
    2022-03-09 14:45:12 (70.1 MB/s) - '/dev/null' saved [1256/1256]

    Blocking All Connections from the User Whose UID Is 1000 ​

    Block network access of the user whose UID is 1000, but allow network access of the user whose UID is 0.

    yaml
    network:
      mode: monitor
      target: container
      cidr:
        allow: ['0.0.0.0/0']
      uid:
        allow: [0]
        deny: [1000]

    !!! example

    shell
    vagrant@ubuntu-impish:~$ id
    uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant)
    
    vagrant@ubuntu-impish:~$ curl -I https://example.com
    curl: (6) Could not resolve host: example.com
    
    vagrant@ubuntu-impish:~$ sudo curl -I https://example.com
    HTTP/2 200

    Files ​

    Linux kernel 5.13 is required to use these options.

    ConfigTypeDescription
    enableEnum with the following possible values: true, falseWhether to enable restrictions or not. The default value is true.
    modeEnum with the following possible values: monitor, blockIf monitor is specified, events are only logged. If block is specified, network access is blocked.
    targetEnum with the following possible values: host, containerSelecting host will apply the restriction to hosts. Selecting container will apply the restriction to containers.
    allowList of allowed file paths
    denyList of denied file paths

    Examples ​

    Allowing Access to All Files ​

    yaml
    file:
      mode: monitor
      target: host
      allow:
        - /

    Blocking Access to /etc/passwd ​

    yaml
    file:
      mode: block
      target: host
      allow:
        - /
      deny:
        - /etc/passwd

    Blocking All Accesses to /root/.ssh ​

    yaml
    file:
      mode: block
      target: host
      allow:
        - /
      deny:
        - /root/.ssh

    Blocking Access to /proc/sys in Containers ​

    yaml
    file:
      mode: block
      target: container
      allow:
        - /
      deny:
        - /proc/sys

    !!! example

    shell
    root@ubuntu-impish:/# ls /proc/sys
    abi  debug  dev  fs  kernel  net  user  vm
    
    root@ubuntu-impish:/# docker run --privileged --rm -it ubuntu:latest bash
    root@9cf961922b00:/# ls /proc/sys
    ls: cannot open directory '/proc/sys': Operation not permitted

    Blocking Escapes from Privileged Containers ​

    yaml
    file:
      mode: block
      target: container
      allow:
        - /
      deny:
        - /proc/sysrq-trigger
        - /sys/kernel
        - /proc/sys/kernel

    !!! example

    shell
    root@ubuntu-impish:/# docker run --privileged --rm -it ubuntu:latest bash
    root@e3b2ffe5b284:/# echo c > /proc/sysrq-trigger
    bash: /proc/sysrq-trigger: Operation not permitted
    
    root@e3b2ffe5b284:/# echo '/path/to/evil' > /sys/kernel/uevent_helper
    bash: /sys/kernel/uevent_helper: Operation not permitted
    
    root@e3b2ffe5b284:/# echo '|/path/to/evil' > /proc/sys/kernel/core_pattern
    bash: /proc/sys/kernel/core_pattern: Operation not permitted

    Processes ​

    Configuration ItemTypeDescription
    enableEnum with the following possible values: true, falseWhether to enable restrictions or not. The default value is true.
    modeEnum with the following possible value: monitorIf monitor is specified, events are only logged.
    targetEnum with the following possible values: host, containerSelecting host will apply the restriction to hosts. Selecting container will apply the restriction to containers.

    Examples ​

    yaml
    mount:
      mode: monitor
      target: host

    Mount ​

    Configuration ItemTypeDescription
    enableEnum with the following possible values: true, falseWhether to enable restrictions or not. The default value is true.
    modeEnum with the following possible values: monitor, blockIf monitor is specified, events are only logged. If block is specified, accesses are blocked.
    targetEnum with the following possible values: host, containerSelecting host will apply the restriction to hosts. Selecting container will apply the restriction to containers.
    denyList of allowed mount paths

    Examples ​

    Blocking the Mount of /var/run/docker.sock to Containers ​

    yaml
    mount:
      mode: block
      target: host
      deny:
        - /var/run/docker.sock