所选语种没有对应资源,请选择:

本站点使用Cookies,继续浏览表示您同意我们使用Cookies。Cookies和隐私政策>

提示

尊敬的用户,您的IE浏览器版本过低,为获取更好的浏览体验,请升级您的IE浏览器。

升级

FusionCloud 6.3.0 安全管理指南 09

评分并提供意见反馈 :
华为采用机器翻译与人工审校相结合的方式将此文档翻译成不同语言,希望能帮助您更容易理解此文档的内容。 请注意:即使是最好的机器翻译,其准确度也不及专业翻译人员的水平。 华为对于翻译的准确性不承担任何责任,并建议您参考英文文档(已提供链接)。
安全加固

安全加固

加固概述

加固的目的

为提供更加安全和稳定的运行环境,需要完善系统安全策略,减少安全漏洞,提高系统抗攻击能力。

加固的影响

安全加固之后,对操作系统的影响有:

  • 只有特定的端口可以访问,可能会影响除Karbor外的第三方软件业务的运行。
  • 由于对文件权限、帐户口令进行了安全加固,从而造成用户使用习惯上的变更,影响了系统的易用性。
需要加固的组件
  • GaussDB数据库
  • Tomcat服务器
  • HAProxy
  • Docker

数据库加固

Karbor使用的Gauss数据库,随Karbor一同安装,安装位置在docker容器内,安装时已经进行了加固,请不要随意修改安全设置,避免引起安全问题。gs_gucgs_dump等命令必须在gaussdb所在的容器内以gaussdba用户来执行,下文提到的数据库相关的配置文件等,如果无特殊说明,默认也在gaussdb所在的容器内。

进入gaussdb容器的方式为在宿主机上执行如下命令:docker exec -ti gaussdb bash,进入容器后,用户会自动切换为gaussdba,无需再手动进行用户切换。

目录说明

  • Gauss数据库安装目录:

    /opt/gaussdb

  • Gauss数据库data目录:

    /opt/fusionplatform/data/gaussdb

帐户安全策略
帐户自动锁定
  • 加固原理

    为了保证帐户安全,如果用户输入密码次数超过10次,系统将自动锁定该帐户。

  • 加固方法

    gs_guc reload -D /opt/fusionplatform/data/gaussdb/ -c "failed_login_attempts=10"

帐户自动解锁功能
  • 加固原理

    当帐户被锁定时间超过24小时,则当前帐户自动解锁。

  • 加固方法

    gs_guc reload -D /opt/fusionplatform/data/gaussdb/ -c "password_lock_time=1"

    其中password_lock_time的单位为天。

数据导入导出安全策略
加密导出文件
  • 加固原理

    GaussDB使用AES128加密方式对导出的文件进行加密。

  • 加固方法

    gs_dump dbname --with-encryption=AES128 --with-key=KEY -f filename

说明:

KEY的长度必须为16位。

解密导入文件
  • 加固原理

    通过SQL命令直接导入文件,导入文件时需要携带导出文件时相同的Key。

  • 加固方法

    gsql dbname -f filename --with-key KEY

审计安全策略
安全配置变更审计
  • 加固原理

    GaussDB在运行过程中,安全相关参数值发生变化时,审计进程会做一次审计记录。GaussDB启动前,安全参数值的变更不会被审计。

  • 加固方法

    在/opt/fusionplatform/data/gaussdb/postgresql.conf配置文件中,修改audit_enabled = on,在宿主机上执行stop_service --service gaussdb和start_service --service gaussdb,重启数据库。主备模式主备GaussDB的配置都需修改,建议先重启备节点数据库。

用户登录、注销审计
  • 加固原理

    对客户端登录成功、失败和注销进行审计。

  • 加固方法

    gs_guc reload -D /opt/fusionplatform/data/gaussdb/ -c "audit_login_logout =6"

数据库启动、停止、恢复、切换审计
  • 加固原理

    开启GaussDB启动、停止、恢复和切换审计功能。

  • 加固方法

    gs_guc reload -D /opt/fusionplatform/data/gaussdb/ -c "audit_database_process =1"

用户锁定和解锁审计
  • 加固原理

    开启审计用户锁定和解锁功能。

  • 加固方法

    gs_guc reload -D /opt/fusionplatform/data/gaussdb/ -c " audit_user_locked =1"

用户访问越权审计
  • 加固原理

    关闭用户越权操作审计功能。

  • 加固方法

    gs_guc reload -D /opt/fusionplatform/data/gaussdb/ -c "audit_user_violation=0"

授权和回收权限审计
  • 加固原理

    开启审计用户权限授予和回收功能。

  • 加固方法

    gs_guc reload -D /opt/fusionplatform/data/gaussdb/ -c "audit_grant_revoke =1"

数据库对象的CREATE、ALTER、DROP操作审计
  • 加固原理

    只对DATABASE、SCHEMA、USER这三类数据库对象的增删改操作进行审计。

  • 加固方法

    gs_guc reload -D /opt/fusionplatform/data/gaussdb/ -c "audit_system_object =7"

具体表的INSERT、UPDATE、DELETE操作审计
  • 加固原理

    关闭具体表的DML操作(SELECT除外)审计功能。

  • 加固方法

    gs_guc reload -D /opt/fusionplatform/data/gaussdb/ -c "audit_dml_state=0"

Tomcat加固

Tomcat是CSBS-VBS Console提供前台web服务使用的容器,随CSBS-VBS Console一同安装,安装时默认已经进行了加固,请不要随意修改安全设置,避免引起安全问题。

CSBS-VBS Console加固
开启日志记录
  • 加固原理
    1. 记录Tomcat的启动、停止日志,在安装部署和启动脚本中记录每个一个操作的时间,操作结果,状态等。
    2. 记录Tomcat运行过程中接收到的请求记录,异常信息等。
  • 加固方法
    1. 在安装部署的脚本每一个操作记录到对应的日志文件中。
    2. 在CSBS-VBS Console所在虚拟机里Tomcat的配置文件server.xml(/opt/huawei/console/tomcat/conf/server.xml)配置日志输出信息。
      <Valve className="com.huawei.wcc.secas.Log4JAccessLogValve"
      pattern="%a %{X-Real-IP}i %{X-Forwarded-For}i %l %u %t &quot;%r&quot; %s %b %D" />
    1. 日志记录位置的配置文件

      /opt/huawei/console/tomcat/lib/log4j.properties

      • log4j.appender.CATALINA.File=${catalina.home}/logs/catalina.out
      • log4j.appender.LOCALHOST.File=${catalina.home}/logs/localhost.log
      • log4j.appender.ACCESSLOG.File=/var/log/console/localhost_access_log.log

      /opt/huawei/console/tomcat/webapps/cbs/WEB-INF/classes/config/log4j.properties

      • log4j.appender.A3.file=/var/log/console/home.log
使用非root帐户运行
  • 加固原理

    使用非root帐户,即cbs帐户运行Tomcat,以控制其最小权限。

  • 加固方法

    在CSBS-VBS Console虚拟机内/etc/console/control.sh文件中指定运行Tomcat服务的用户。

    su -s /bin/bash -c "sh $TOMCAT_DIR/bin/startup.sh" $program_user 2>&1 > /dev/null

限制访问协议
  • 加固原理

    所有请求都使用Https协议,保证浏览器到服务器之间的传输通道的安全性。

  • 加固方法

    在server.xml文件中做如下配置:

    1. 开启SSL协议

      SSLEnabled="true"

    1. 指定SSL协议版本只支持TLSv1.2

      sslEnabledProtocols=" TLSv1.2"

    1. 设置安全加密套件

      ciphers="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA"

证书密码密文保存
  • 加固原理

    默认情况下Tomcat配置文件中的证书密码是明文,存在安全风险。首先将证书密码通过安全加密方式生成密文保存在server.xml中,启动服务时将证书密码解密后使用。

  • 加固方法
    1. 证书密码设置成密文。

      keystorePass="d2NjX2NyeXB0ATQxNDU1MzVGNDM0MjQzOzQxMzE0MjQ1MzgzNDQ0Mzg0NDQzMzAzNDMxMzM0NTM4NDM0NjQ2MzYzNjQ2NDEzMjM5NDEzOTQzMzUzNDM3NDM7OzMxMzAzMDMwMzA7NUU1NjFFNTQyRDQyRTM4QzdFMDE3N0M4RkQ1RjcyRTk7RTBCRjY0NzE2RDlERUM0Njs"

    1. 在配置文件中指定重写后的是实现类。

      protocol="com.huawei.wcc.secas.Http11Protocol"

限制最大请求数
  • 加固原理

    限制Tomcat接收的请求个数防止对服务进行暴力攻击。

  • 加固方法

    在Tomcat配置文件server.xml中设置最大请求个数。

    maxThreads="150"

支持SSL证书替换
  • 加固原理

    Tomcat默认使用版本自定义的证书,客户可将其替换成自己的证书。

  • 加固方法

    请参考《FusionCloud 6.3.0 安全管理指南》灾备服务 > CSBS-VBS Console > 证书管理 > 替换Tomcat的TLS认证证书章节进行替换。

  • 回退方案
    1. 在替换证书之前,先将待替换的所有证书进行备份。
    2. 使用备份的证书重新参照证书替换的方法进行替换。

HAProxy加固

Karbor使用的HAProxy,随Karbor一同安装,安装在docker容器内。安装时已经进行了HAProxy的加固,请不要随意修改安全设置,避免引起安全问题。

开启日志记录
  • 加固原理

    记录所有Restful API请求。haproxy的日志记录格式如下:日志时间、主机名、haproxy处理进程号、源端口、接收日期、haproxy前端名、后端名、HTTP请求返回码、经过haproxy字节数、请求行等。

  • 加固方法

    在/opt/huawei/dj/etc/haproxy/cfg/haproxy_global.conf中的defaults下配置:

    option httplog

    重启haproxy进程:

    haproxyinternalControl -A RESTART

    haproxytenantControl -A RESTART

    haproxymanageControl -A RESTART

使用非root帐户运行
  • 加固原理

    使用非root帐户,即openstack帐户运行haproxy,以控制其最小权限。

  • 加固方法

    在使用Dockerfile生成镜像时,增加USER openstack。运行docker容器时,则会以openstack用户运行haproxy。

限制haproxy最大并发数
  • 加固原理

    全局最大并发连接数为4096,单个前端的最大并发连接数为2000。

  • 加固方法

    在/opt/huawei/dj/etc/haproxy/cfg/haproxy_global.conf中的global下配置:

    maxconn 4096

    defaults下配置:

    maxconn 2000

    重启haproxy进程:

    haproxyinternalControl -A RESTART

    haproxytenantControl -A RESTART

    haproxymanageControl -A RESTART

限制SSL协议版本
  • 加固原理

    启动SSL加密通道对外提供服务,关闭不安全协议, 保证数据安全传输。

  • 加固方法

    在/opt/huawei/dj/etc/haproxy/cfg/haproxy_global.conf中的global下配置:

    ssl-default-bind-options no-sslv3 no-tlsv10

    重启haproxy进程:

    haproxyinternalControl -A RESTART

    haproxytenantControl -A RESTART

    haproxymanageControl -A RESTART

替换SSL证书文件
  • 加固原理

    保证数据传输的安全性,haproxy前端、后端均配置ssl证书。

  • 加固方法

    分别替换前端证书:

    /opt/huawei/dj/DJSecurity/server-cert/haproxy/manage-cert.pem

    /opt/huawei/dj/DJSecurity/server-cert/haproxy/tenant-cert.pem

    /opt/huawei/dj/DJSecurity/server-cert/haproxy/haproxy-cert.pem

    替换后端证书:/opt/huawei/dj/DJSecurity/server-ca/ca-cert.pem

    重启haproxy进程:

    haproxyinternalControl -A RESTART

    haproxytenantControl -A RESTART

    haproxymanageControl -A RESTART

绑定具体IP
  • 加固原理

    haproxy反向代理后,service-api端口需要限制绑定内部通信平面的具体IP地址。

  • 加固方法

    在生成haproxy配置文件时,会固定将服务端口绑定至管理面、租户面或内部面浮动IP上,不需要做特别处理。

Docker加固

Karbor使用的Docker在安装时已经进行了加固,请不要随意修改安全设置,避免引起安全问题。

主机配置
从主机上删除不必要的程序应用

说明

一些不必要的应用服务会导致攻击面的增加。运行docker daemon的主机,除了容器主进程外,其他跟业务不相关的应用程序(比如web server,database等)不允许安装。

实现

Karbor除了安装业务必须的组件外,不会安装跟业务不相关的应用程序。

主机提供对Docker守护进程审计功能

在文件/etc/audit/rules.d/audit.rules中添加命令:

-w /usr/bin/docker -k docker

然后重启日志守护进程:

service auditd restart
说明:

开启审计功能会产生大量日志文件,要定期对日志文件进行转储。建议审计功能使用单独分区。

主机提供对Docker关键文件和目录的审计功能

说明

这些目录和文件包括:/var/lib/docker、/etc/docker、/usr/bin/docker-containerd-shim、/usr/bin/docker-containerd-ctr、/usr/bin/docker-containerd、/usr/bin/docker-runc、docker.service等。这些目录存放着跟容器相关的重要信息,主机应当提供对这些关键目录可审计功能。

实现

在文件/etc/audit/rules.d/audit.rules中添加命令:

-w /etc/docker -k docker

然后重启日志守护进程:

service auditd restart
说明:

开启审计功能会产生大量日志文件,要定期对日志文件进行转储。建议审计功能使用单独分区。

Docker守护进程配置
设置守护进程日志级别

说明

通过设置合适的日志级别来配置Docker守护进程记录到日志的事件。一般情况下,“info”级别的日志可记录除调试日志外的所需要的所有事件日志。所以,日志级别设置为“info”即可。除非有特殊需要,禁止设置“debug”级别。

实现

通过如下命令进行设置:

/usr/bin/docker daemon --log-level="info"
允许Docker修改iptables

说明

iptables用来设置、维护和检查Linux内核中的IP包过滤规则表。应允许Docker守护进程对iptables进行修改。因为这样Docker服务器将根据你为容器选择网络选项的方式自动对iptables进行所需的更改。建议让Docker服务器自动更改iptables,以避免网络配置错误而阻碍容器和外部世界之间的通信。此外,它会节省每次选择运行容器或修改网络选项时更新iptables的麻烦。

实现

不采用以下方式启动Docker守护进程:

/usr/bin/docker daemon --iptables=false

保证返回值中没有--iptables或没有设置为false。

Docker守护进程配置文件
docker.service文件所有权为root:root

说明

docker.service文件包含可能会改变Docker守护进程行为的敏感参数。 因此,它的属主和属组必须是root,以维护文件的完整性。

实现

先通过下面命令找出文件的位置:

systemctl show -p FragmentPath docker.service

如果文件不存在,则可以忽略该条建议。如果存在,假设为/usr/lib/systemd/system/docker.service,通过下面命令设置权限:

chown root:root /usr/lib/systemd/system/docker.service
docker.service文件权限为600

说明

docker.service文件包含可能会改变Docker守护进程行为的敏感参数。因此,如果没有特殊需求,它的权限应设为600,以维护文件的完整性。

实现

先通过下面命令找出文件的位置:

systemctl show -p FragmentPath docker.service

如果文件不存在,则可以忽略该条建议。如果存在,假设为/usr/lib/systemd/system/docker.service,通过下面命令设置权限:

chmod 600 /usr/lib/systemd/system/docker.service
/etc/docker目录所有权设为root:root

说明

/etc/docker目录包含各类敏感文件和证书及密钥。因此,该目录的属主和属组必须是root,以保证文件的完整性。

实现

将目录的属主和属组设为root

chown root:root /etc/docker
/etc/docker目录权限设为755或更严格

说明

/etc/docker目录包含各类敏感文件和证书及密钥。因此,该目录应只对root可写,以保证文件的完整性。

实现

将目录权限设为755或更严格:

chmod 755 /etc/docker
容器镜像和构建文件
创建一个容器用户

说明

在Dockerfile中为容器镜像创建一个非root帐户。

如有可能,通过非root帐户运行容器。尽管可以映射用户命名空间,但如果已经在容器镜像中定义了一个用户,该容器默认由该用户运行,无需再进行用户命名空间重映射。

实现

在Dockerfile中创建组/用户。例如:

# Add group 
RUN groupadd -g 51001 openstack
# Add user 
RUN useradd -g openstack -u 51001 -d /home/openstack -s /bin/false -m openstack 
# Run in user openstack
USER openstack
不在Dockerfile中存储机密信息

说明

使用docker history等Docker命令以及各种工具和程序可以轻松回溯Dockerfile。另外,镜像发布商通常会提供Dockerfile,证明其镜像的可信性。因此,这些Dockerfile里的机密信息很容易被暴露和利用。

实现

Karbor未在Dockerfile中存储机密信息。

容器运行
不使用特权容器

说明

使用--privileged标签,可以给予容器所有的Linux内核Capability,确保不使用--privileged标签。

--privileged标签给予容器所有Capability,还会取消设备cgroup(控制群组)控制器施行的所有限制。换句话说,容器可以执行主机能够执行的几乎所有操作。这一标签用来运行特殊的使用实例,如在Docker内运行Docker。

实现

不使用--privileged标签运行容器。例如,不通过下面的方式启动容器:

docker run --interactive --tty --privileged centos /bin/bash
只打开容器需要的端口

说明

容器可以只使用Dockerfile中为其镜像定义的端口运行,也可以任意传递运行时参数以打开端口列表。此外,随着时间的推移,Dockerfile可能会经历各种更改,暴露的端口列表可能与容器中运行的应用程序相关,也可能不相关。打开不需要的端口会加大容器和容器化应用程序的攻击面。因此不要暴露不需要的端口。

实现

启动容器时,不使用“-P”(大写)或“--publish-all”标志,即可完全忽略在Dockerfile中定义的端口列表。使用“-p”(小写)或“--publish”标志,明确定义特定容器实例所需的端口。例如:

docker run --interactive --tty --publish 28799 centos /bin/bash
限制容器的内存使用

说明

容器默认可以使用主机上的所有内存。可以使用内存限制机制来防止因某一容器耗尽主机所有资源,从而使同一主机上其他容器无法执行预期功能而导致的拒绝服务。不限制内存的话,一个容器可轻易破坏整个系统稳定性,从而导致系统不可用。

实现

运行容器时只使用所需的内存。始终使用‘-m’或‘—memory’参数运行容器,指定容器使用的内存。例如:

docker run  --memory 256m centos /bin/bash
适当设置容器CPU优先级

说明

CPU时间默认在各容器之间平均分配。如有需要,可以使用CPU共享特性控制CPU时间在容器实例之间的分配。CPU共享功能将容器进行优先级排序,并禁止优先级低的容器频繁地占用CPU资源,确保优先级高的容器得到更好的服务。

实现

管理各容器之间的CPU份额。为此,请使用‘-c’或‘--cpu-shares’参数启动容器。例如:

docker run --interactive --tty --cpu-shares 512 centos /bin/bash
说明:

在以上示例中,该容器占用的CPU份额为512。这里对CUP份额值(cpu-shares)进行一下解释:cpu-shares值为一个相对值,实际CPU利用率则取决于系统上运行容器的数量。假如一个单核的主机运行3个container,其中一个cpu-shares设置为1024,而其它cpu-shares被设置成512。当3个容器中的进程尝试使用100% CPU的时候(尝试使用100% CPU很重要,此时才可以体现设置值),则设置1024的容器会占用50%的CPU时间。如果又添加一个cpu-shares为1024的container,那么两个设置为1024的容器CPU利用占比为33%,而另外两个则为16.5%。简单的算法就是,所有设置的值相加,每个容器的占比就是CPU的利用率,如果只有一个容器,那么此时它无论设置512或者1024,CPU利用率都将是100%。当然,如果主机是3核,运行3个容器,两个cpu-shares设置为512,一个设置为1024,则此时每个container都能占用其中一个CPU为100%。请注意:每个新容器默认占用的CPU为1024。

将传入的容器流量绑定到特定主机接口

说明

Docker容器默认可以连接到外部世界,但外部世界不能连接到容器。每个对外连接显示都是源自主机的IP地址。只允许通过主机上的特定外部接口接触容器服务。

如果主机上有多个网络接口,则容器可以接受任何网络接口上暴露的端口连接。这可能不是期望的结果,也可能不受保护。很多时候,特定接口会对外暴露,并且在这些接口上运行诸如入侵检测,入侵防御,防火墙,负载平衡等服务以筛选传入的公共流量。因此,不应接受任何接口上的传入连接,只接受来自特定外部接口的传入连接。这里主机接口通指网络接口,是主机与外部系统的连接通道,而主机端口是指该主机接口对应的TCP/UDP端口,接口一般包含IP地址和端口。

实现

将容器端口绑定到所需主机端口上特定的主机接口。例如:

docker run --detach --publish 192.168.3.4:8799:28799 kabor

在以上示例中,容器端口28799绑定到主机上的8799端口,并且将只接受来自192.168.3.4外部接口的传入连接。

禁止将挂载传播模式设置为共享模式

说明

挂载传播模式允许挂载卷以共享(share)、从属(slave)和私有(private)模式挂载,禁止以共享模式挂载。以共享模式挂载会对所有挂载卷进行复制,任何一个挂载卷的修改会传播所有其它挂载卷。且此模式下不会限制其它容器挂载和对该卷进行更改。默认情况下容器挂载模式为私有模式。

实现

启动容器时,指定-v时后面不允许加shared。

容器内禁止运行SSH

说明

SSH服务器不应该在容器中运行。应该通过SSH进入Docker主机,并使用nsenter工具从远程主机进入容器。在容器中运行SSH会增加安全管理的复杂性:

  • 难以管理SSH服务器的访问策略和安全合规性;
  • 难以跨各种容器管理密钥和密码;
  • 难以管理SSH服务器的安全升级;

    可以使用shell访问容器而不使用SSH,应该避免不必要地增加安全管理的复杂性。

实现

缺省情况下容器内是没有运行SSH服务。

禁止在容器内映射特权端口

说明

低于1024的TCP/IP端口号被认为是特权端口。默认情况下,如果用户没有特别声明容器端口到主机端口的映射,Docker会自动地将容器端口映射到主机上的49153-65535区间的一个容器端口。但是如果用户明确声明,Docker允许容器端口映射到主机上的特权端口。这是因为容器使用NET_BIND_SERVICE Linux内核功能来执行,不会限制特权端口映射。特权端口接收和发送各种敏感数据,允许容器使用它们可能会带来严重的影响。

实现

Karbor映射时确保不会使用特权端口。

不共享主机进程命名空间

说明

进程ID(PID)命令空间可以隔离进程ID号空间,使得不同PID命名空间中的进程可以具有相同的PID,以实现容器和主机之间的进程级隔离。PID命名空间提供进程的分离。PID命名空间去掉了系统进程的视图,并允许重新使用进程ID,包括PID。如果主机的PID命名空间与容器共享,则基本上允许容器中的进程查看主机系统上的所有进程。这打破了主机和容器之间的进程级隔离。有权访问容器的人最终可以知道在主机系统上运行的所有进程,甚至可以从容器内杀死主机系统进程。因此,不要与容器共享主机的进程命名空间。

实现

在启动容器时不要使用参数--pid=host,如不要使用类似下面方式启动容器:

docker run --interactive --tty --pid=host centos /bin/bash
不在容器中运行不必要的软件

说明

容器中若使用不必要的软件可能会加大容器的攻击面,同时也违背了最小和精简容器镜像的概念。因此,不要为容器安装或运行任何不必要的软件。

实现

Karbor只会安装跟业务相关的必须组件,不会运行其他不必要的软件。

翻译
下载文档
更新时间:2019-01-25

文档编号:EDOC1100015665

浏览量:29705

下载量:796

平均得分:
本文档适用于这些产品
相关文档
相关版本
Share
上一页 下一页