安全加固

加固须知

本文中列出的安全加固措施为基本的加固建议项。用户应根据自身业务,重新审视整个系统的网络安全加固措施。用户应按照所在组织的安全策略进行相关配置,包括但不限于软件版本、口令复杂度要求、安全配置(协议、加密套件、密钥长度等),权限配置、防火墙设置等。必要时可参考业界优秀加固方案和安全专家的建议。

操作系统安全加固

用户需按照所在组织的安全策略,及时更新安全补丁,并使用所在组织认可的软件版本。

防火墙配置

操作系统安装后,若配置普通用户,可以通过在“/etc/login.defs”文件中新增ALWAYS_SET_PATH字段并设置为yes,防止越权操作。

设置umask

建议用户将主机(包括宿主机)和容器中的umask设置为027及以上,提高安全性。

以设置umask为077为例,具体操作如下所示。

  1. 以root用户登录服务器,编辑“/etc/profile”文件。

    vim /etc/profile
    
  2. 在“/etc/profile”文件末尾加上umask 077,保存并退出。

  3. 执行如下命令使配置生效。

    source /etc/profile
    

无属主文件安全加固

因为官方Docker镜像与物理机上的操作系统存在差异,系统中的用户可能不能一一对应,导致物理机或容器运行过程中产生的文件变成无属主文件。

用户可以执行find / -nouser -o -nogroup命令,查找容器内或物理机上的无属主文件。根据文件的UID和GID创建相应的用户和用户组,或者修改已有用户的UID、用户组的GID来适配,赋予文件属主,避免无属主文件给系统带来安全隐患。

端口扫描

需要关注全网侦听的端口和非必要端口,如有非必要端口请及时关闭。建议用户关闭不安全的服务,如Telnet,FTP等。具体关闭方法请参考所使用的操作系统相关文档。

防DoS攻击

可以通过添加白名单和调整服务组件并发参数大小等方式,防止资源被恶意请求占满。

SSH安全加固

用户可以通过修改/etc/ssh/下或者~/.ssh下的配置文件,如ssh_config和sshd_config等对SSH连接的安全性进行加固。建议禁止使用SSH v1协议,以及不安全的通信协议加密组件等。用户需注意,开启root登录会有安全风险,详细信息请参考所使用的操作系统的相关文档。

用户可以通过公私钥的方式进行SSH认证登录。在使用此方式时,用户需要注意使用的算法和密钥长度需要满足所在组织的安全要求。一个参考是RSA算法下密钥长度不应低于3072位。同时,用户不应设置空口令的私钥,这会带来安全风险。私钥口令的长度和复杂性应当满足用户所在组织的安全要求。

内存地址随机化机制安全加固

建议用户执行以下命令将/proc/sys/kernel/randomize_va_space中的值设置为2。

sysctl -w kernel.randomize_va_space=2

若需永久生效,可在“/etc/sysctl.conf”中添加kernel.randomize_va_space = 2并执行sysctl -p命令。

防止MPI全零侦听

  • MPI初始化拉起的后台mpirun进程存在端口未认证问题,存在被攻击的风险。

    规避措施:MPI启动之后添加防火墙规则,防止外部网络连接mpirun和orted(mpi内部组件)侦听的端口,运行结束后需要清理防火墙规则。

    • 添加防火墙规则

      ```shell
      iptables -A INPUT -p tcp -j ${规则名}
      iptables -F ${规则名}
      iptables -X ${规则名}
      iptables -t filter -N ${规则名}
      iptables -I INPUT -p tcp -j ${规则名}
      iptables -t filter -I ${规则名} -i ${要限制网卡} -p tcp --dport ${要限制的端口} -j DROP
      
    • 清除防火墙规则

      ```shell
      iptables -D INPUT -p tcp -j ${规则名}
      iptables -F ${规则名}
      iptables -X ${规则名}
      
  • MPI默认配置项在启动超节点P2P带宽测试进程时会对0.0.0.0地址进行侦听。

    规避措施:找到MPI配置路径下的etc文件夹,在“openmpi-mca-params.conf”文件末尾添加以下配置项。通过该配置项指定MPI通信使用的网卡。此网卡需要和防火墙规则里的网卡保持一致。

      btl_tcp_if_include = lo

    Note

    推荐用户仅在容器中使用MPI,并由网络命名空间进行隔离。以保证宿主机上无全零侦听,且宿主机其他用户无法连接OpenMPI未认证端口。

容器安全加固

启用对Docker的审计功能

审计内容

  • Docker守护进程在主机里是以root权限运行的,权限很大。建议用户在主机上配置一种对Docker守护进程运行和使用状态的审计机制。一旦Docker守护进程出现越权攻击行为,可以追溯攻击事件根源。开启审计功能请参见开启对Docker的审计功能

  • 以下目录存放着和容器相关的重要信息,建议对如下目录和关键文件配置审计功能。

    • /var/lib/docker
    • /etc/docker
    • /etc/default/docker
    • /etc/docker/daemon.json
    • /usr/bin/docker-containerd
    • /usr/bin/docker-runc
    • docker.service
    • docker.socket

    以上目录为Docker默认的安装目录,如果为Docker创建了单独的分区,路径可能会变。开启审计功能请参见开启对Docker的审计功能

开启对Docker的审计功能

默认情况下主机没有开启审计功能。可以通过以下方式添加审计规则。

Note

开启审计机制需要安装auditd软件,如Ubuntu可使用apt install -y auditd命令进行安装。

  1. 在文件“/etc/audit/audit.rules”中添加规则,每个规则为一行,规则的格式如下。

     -w file_path -k docker

    表 1 参数说明

    参数 说明
    -w 筛选文件路径。
    file_path 开启审计规则的文件路径。如:
    • file_path为/usr/bin/docker时,表示开启主机对Docker守护进程的审计。
    • file_path为/etc/docker时,表示开启主机对Docker相关目录和关键文件审计。
    -k 筛选字符串,用于按照规定的关键字筛选。

    Note

    如果“/etc/audit/audit.rules”文件中有“This file is automatically generated from /etc/audit/rules.d”,此时修改“/etc/audit/audit.rules”文件无效,需要修改“/etc/audit/rules.d/audit.rules”文件才能生效。如在Ubuntu系统中需要修改“/etc/audit/rules.d/audit.rules”文件。

  2. 配置完成后需要重启日志守护进程。

    service auditd restart
    

设置Docker配置文件权限

“/etc/docker/daemon.json”文件权限配置

  • daemon.json文件属主和属组设为root:root,文件权限设为600。

    daemon.json文件包含更改Docker守护进程的敏感参数,是重要的全局配置文件,其属主和属组必须是root,且只对root可写,以保证文件的完整性。该文件并不是默认存在的。

    • 如果daemon.json文件默认不存在,说明产品没有使用该文件进行配置,那么可以执行以下命令,在启动参数中将配置文件设置为空,不使用该文件作为默认配置文件,避免被攻击者恶意创建并修改配置。

      dockerd --config-file=""
      

      或者

      systemctl restart docker
      
    • 如果产品环境存在daemon.json文件,说明已经使用了该文件进行配置操作,需要设置相应权限,防止被恶意修改。

      1. 执行以下命令,将文件的属主和属组设为root。

        chown root:root /etc/docker/daemon.json
        
      2. 执行以下命令,将文件权限设为600。

        chmod 600 /etc/docker/daemon.json
        

控制Docker使用权限

使用Docker时,建议客户在运行容器时使用非root用户。特殊情况除外,如NPU-Exporter组件需要使用root用户运行容器。

关闭容器中不安全的协议

为避免安全风险,建议用户使用安全协议,如SSHv2、TLS1.2、TLS1.3、IPsec、SFTP和SNMPv3等。若容器中使用了不安全协议,如TFTP、FTP、Telnet、SSL2.0、SSL3.0、TLS1.0、TLS1.1、SNMPv1、SNMPv2、SSHv1.x等,在不影响业务正常运行的情况下建议关闭或使用安全协议替代。

为Docker创建单独分区

Docker安装后默认目录是“/var/lib/docker”,用于存放Docker相关的文件,包括镜像、容器等。当该目录存储已满时,Docker和主机可能无法使用。因此,建议创建一个单独的分区(逻辑卷),用来存放Docker文件。

  • 新安装的设备,创建一个单独的分区,用于挂载“/var/lib/docker”目录。
  • 已完成安装的系统,请使用逻辑卷管理器(LVM)创建分区。

限制容器的文件句柄和fork进程数

为避免攻击者在容器内使用命令启动fork炸弹,造成拒绝服务,建议用户设置全局默认的ulimit,对创建的文件句柄、进程数进行限制。

  1. 打开配置文件。

    • CentOS 7.6默认为“/usr/lib/systemd/system/docker.service”文件。
    • Ubuntu18.04默认为“/lib/systemd/system/docker.service”文件。
  2. 修改配置文件。

    在配置文件中找到“/usr/bin/dockerd”所在行,并在该行后面增加nofile(创建的文件句柄)参数和nproc(进程)参数的限制。

    修改示例如下,请根据实际情况设置对应的值。

     ...
     # the default is not to use systemd for cgroups because the delegate issues still
     # exists and systemd currently does not support the cgroup feature set required
     # for containers run by docker
     /usr/bin/dockerd --default-ulimit nofile=20480:40960 --default-ulimit nproc=1024:2048
     ...

    其中--default-ulimit nproc=1024:2048表示限制进程数量为1024个,可以在进程中修改该值,但是不能超过2048,且第一个值要小于或等于第二个值。nofile配置含义同nproc

镜像仓库安全

镜像仓库的安全风险主要包括仓库本身的安全风险和镜像拉取过程中的传输安全风险。

用户需要注意以下安全问题:

  • 仓库自身安全:如果镜像仓库,特别是私有镜像仓库被恶意攻击者所控制,那么该仓库中所有镜像的安全性将无法得到保证。
  • 镜像拉取安全:保证容器镜像从镜像仓库到用户端的完整性。

镜像漏洞

镜像漏洞安全风险主要包括镜像中的软件含有CVE漏洞、攻击者上传含有恶意漏洞的镜像等情况。

Dockerfile文件中,FROM命令基于的基础镜像,需要用户注意基础镜像CVE漏洞。镜像的获取通常是通过官方镜像仓库Docker Hub。根据对Docker Hub中镜像安全漏洞的相关研究,无论是社区镜像还是官方镜像,其平均漏洞数均接近200个。

Dockerfile安全

Dockerfile是包含用于组合镜像命令的文本文件,一般由基础镜像信息(FROM)、维护者信息(MAINTAINER)、镜像操作指令(RUN、ADD、COPY等)和容器启动时执行指令(CMD等)四个部分组成,Docker可通过读取Dockerfile中的命令创建容器镜像。Dockerfile文件是提供给用户的参考样例文件,用户在此基础上修改后,需要注意Dockerfile中安装第三方软件的安全问题。

  • 用户请勿在容器内开启SSH服务。
  • 在容器内使用非root用户运行。
  • 经常扫描和重建镜像,及时加入安全补丁。
  • 确认Dockerfile中ADD操作的文件为可信文件。
  • 不在Dockerfile中存储敏感信息。
  • 在镜像内加入健康检测。
  • 不要单独或者在单行命令中使用update更新指令。