Aqua容器安全解决方案POC测试步骤.docx

上传人:牧羊曲112 文档编号:4117250 上传时间:2023-04-05 格式:DOCX 页数:32 大小:1.43MB
返回 下载 相关 举报
Aqua容器安全解决方案POC测试步骤.docx_第1页
第1页 / 共32页
Aqua容器安全解决方案POC测试步骤.docx_第2页
第2页 / 共32页
Aqua容器安全解决方案POC测试步骤.docx_第3页
第3页 / 共32页
Aqua容器安全解决方案POC测试步骤.docx_第4页
第4页 / 共32页
Aqua容器安全解决方案POC测试步骤.docx_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《Aqua容器安全解决方案POC测试步骤.docx》由会员分享,可在线阅读,更多相关《Aqua容器安全解决方案POC测试步骤.docx(32页珍藏版)》请在三一办公上搜索。

1、Aqua容器安全解决方案POC测试步骤2017-10-27Version 1.0说明包含于此篇文档中的信息属于商业或财务机密(或授权)信息。文档为安领有限公司所专有,且只用于评估目的,除非被安领有限公司授权,否则此文档的全部或者部分信息不得用于再版或者引用。版本历史日期版本描述2017-10-271.0内容1.准备工作52.镜像扫描62.1白名单镜像62.2禁止未扫描镜像运行62.3镜像安装包的黑白名单62.4自定义规则扫描镜像62.5包含敏感信息的镜像72.6结合Jenkins进行镜像扫描73.威胁阻止93.1Process limits93.2只允许Link内容器互相通信94.敏感信息管理

2、104.1自纳管Secret104.2CyberArk纳管Secret105.容器运行限制125.1以指定用户运行容器125.2限制容器运行时的只读文件135.3限制容器运行时的可执行命令145.4限制Container运行时的进出网络155.5黄金镜像-保证Container不对容器内任何文件进行修改165.6限制Container不以特权模式运行175.7限制Container挂载的数据卷175.8自主学习并生成安全规则185.9限制容器运行时使用的资源及进程数195.10环境变量加密206.网络控制216.1容器与Host之间网络限制216.2容器与容器间的网络限制217.主机权限管控2

3、37.1角色权限管控237.2自定义Role角色237.3通过image的label来分发权限248.其他258.1Rootplease容器修改主机配置文件258.2私有Registry搭建258.3Swarm部署Aqua Agent268.4Rancher部署Aqua Agent271. 准备工作在Docker Host主机上安装完Aqua Server环境后,可执行以下步骤将测试用镜像及配置文件导入到环境中。1. 将optfolder下的文件夹上传到Docker Host的/opt路径下2. 通过df -h命令确保测试主机/var路径挂载磁盘剩余空间大于10G,否则导入镜像会导致磁盘满3.

4、 将测试镜像上传到Docker Host主机内,并通过docker loadImagesAdd imageslocal engine,手动逐一添加步骤2里导入的镜像文件。除了imagescan/labeltest外都导入,此镜像将用于未扫描镜像测试。注:如果不想逐一添加也可配置自动拉取本地镜像,SystemIntegrationsLocal Engine勾选Automatically Pull New Images。这样Aqua Agent就会在配置的指定拉取时间拉取本地镜像进行扫描。 5. 登录Aqua Web端SystemSettings,点击Import按钮导入aqua_文件6. 通过g

5、roupadd docker添加docker用户组2. 镜像扫描2.1 白名单镜像1. 通过Image Assurance内配置,首先设置Disallow Images by CVE Severity,则执行docker run -v /:/hostOS -i -t chrisfosterelli/rootplease失败2. 通过Image Assurance内配置,设置chrisfosterelli/rootplease镜像为WhitelistImage,则执行docker run -v /:/hostOS -i -t chrisfosterelli/rootplease成功2.2 禁止未

6、扫描镜像运行1. 通过Image Assurance内配置,设置Block Unregistered Images,同时对应label (key=vaule)的镜像可以做例外,如下图2. 执行docker run -d imagescan/labeltest未扫描镜像可以正常运行,因为此镜像已打了license=GPLv2的label,如果将此例外去了即被禁止运行2.3 镜像安装包的黑白名单1. 通过Image Assurance内,设置Package Blacklist,禁止包含黑名单Package的镜像运行,可填写python包,所有版本,则执行docker run -d centos被禁

7、止2. 通过Image Assurance内,设置Package Whitelist,可以设置镜像必须包含的安装程序包,如未包含白名单内安装包,镜像将被禁止执行,可填写python包,所有版本,则执行docker run -d alpine被禁止2.4 自定义规则扫描镜像1. 通过Image Assurance内,设置Custom Checks可以使用自定义规则脚本进行扫描,脚本返回0则禁用镜像。使用默认SSH包检查脚本即可,任何安装了SSH包的镜像都将被禁用2. 在Images页面将imagescan/centoswithssh镜像Rescan重新扫描3. 执行docker run -it

8、-rm imagescan/centoswithssh /bin/bash 被禁止,因为此镜像安装了SSH包被Disallow2.5 包含敏感信息的镜像1. 在SystemSettings内,勾选Scan Options下的Scan sensitive data in images并Save2. 通过Image Assurance内,设置Disallow Images with Sensitive Data,可以设置包含敏感信息(比如Private RSA key)的镜像被禁止运行3. 执行docker run -d imagescan/sensitivedata失败,因为其/opt路径下有i

9、d_rsa的Private RSA key2.6 结合Jenkins进行镜像扫描1. 在Docker host主机上执行:chmod -R 777 /opt/jenkinsdocker run -d -u root -v/opt/jenkins:/var/jenkins_home -v /var/run/:/var/run/ -v $(which docker):/usr/bin/docker:ro -v /usr/lib64/.0:/usr/lib/x86_64-linux-gnu/.0 -v /usr/lib64/.0:/usr/lib/x86_64-linux-gnu/.0 -v /us

10、r/lib64/.1.02:/usr/lib/x86_64-linux-gnu/.1.02 -v /usr/lib64/.11:/usr/lib/x86_64-linux-gnu/.11 -v /usr/lib64/.1:/usr/lib/x86_64-linux-gnu/.1 -v/usr/lib64/.7:/usr/lib/x86_64-linux-gnu/.7 -p 9090:8080 -name jenkins -restart=always jenkins2. 生成的jenkins可通过http:/:9090进入,用户名为admin,密码为password。3. 进入Manage J

11、enkinsConfigure System将以下各项按实际情况填写,其中的IP地址都是docker host测试主机的。4. 点击test项目manage,设置项目要扫描的镜像名及其所属Registry名,此处Registry名为在Aqua Server SystemIntegrationsRegistry里进行绑定的名字。5. 最后运行test项目的build即可,里面已添加了Aqua镜像扫描的步骤,从Console output查看扫描执行结果3. 威胁阻止3.1 Process limits1. 通过Threat Mitigation内,勾选Fork Guadr下的Enable For

12、k Bomb Protection,设置Process limit为10后保存2. 执行docker run -d threattest/process,里面已开启了超过10个进程,多余进程会被禁止生成3.2 只允许Link内容器互相通信1. 执行以下命令生成两个容器:docker run -it -v /opt/aquatest:/usr/share/nginx/html:ro -p 80:80 -d -name nginxweb networktest/nginxwebdocker run -it -d -name test centos生成后进入test容器可以curl到nginx发布的

13、网页docker exec -it test /bin/bashcurl http:/2. 在Threat MitigationBlock Networking Between unlinked Containers下勾选Block Network保存后,再次进入test容器无法curl到网页3. 重新生成新的带link的centos访问容器即可curl到网页docker run -it -d -link nginxweb:testlink centos4. 敏感信息管理4.1 自纳管Secret1. 通过之前的配置导入,前台网页Secret内应已有一个ord2. 运行docker run -

14、it -d -name secret secrettest/static_password此容器已将ord作为Password环境变量打入。用户执行docker inspect secret|grep password 只会看到Password=ord,看不到真实值3. 用户执行docker exec -it secret /bin/bash进入容器执行env命令后,可看到真实值。同时用户如在前台网页端对ord的值进行更改后,容器内对应值也会动态刷新到,不需要重启容器4.2 CyberArk纳管Secret1. Aqua可以CyberArk的CCP进行绑定配置,通过其获取CyberArk平台内

15、保存的密码。通过SystemIntegrationsSecret Key Stores,点击Add Secret Key Store进行绑定,其中的Test Connection按钮没有任何实际作用。l Connecition URL: CCP的访问地址,只需要填写IP地址,不需要后缀l AppID:CCP使用的AppIDl Safe: 获取密码账号所在Safel Pull Interval: 定期刷新时间 (测试下来没有实际功能,即无法将新值自动刷新到容器内)2. 在绑定的Cyberark Vault内,创建Windows Safe,配置CCP相关APPID和Provider用户对此Safe

16、有获取密码权限,同时创建一个测试账号,账号名为CyberArkVaultTest3. 在Aqua网页端SecretsAdd New Secret,在Store处选择步骤一新建的CyberArk Store名,在Name处填写Vault内账号名,即CyberArkVaultTest4. 点击Save的同时,Aqua会尝试获取密码,如有报错会直接在页面内显示出来5. 运行docker run -it -d -name secret secrettest/static_password此容器已将ArkVaultTest作为CyberArkPassword环境变量打入。用户执行docker inspe

17、ct secret|grep Cyber 只会看到CyberArkPassword=ArkVaultTest,看不到真实值6. 用户执行docker exec -it secret /bin/bash进入容器执行env命令后,可看到真实值。5. 容器运行限制5.1 以指定用户运行容器当运行容器时没以-u参数指定运行用户环境时,Docker默认将以root用户运行容器,最高用户权限所带来的风险可想而知。用户可通过Aqua Security中的Runtime profile来限制容器运行时只能以当前Host用户的UID和GID来运行1. 不加-u参数运行容器后,得到的UID和GID为Host当前用

18、户docker2. 同时我们可以限制容器不以root用户运行。3. 当以root用户运行容器时,得到Permission Denied的报错,同时Aqua Security内也有对应Block日志。运行命令为docker run -it runtime/runuser /bin/sh5.2 限制容器运行时的只读文件1. 用户通常希望在Container运行时不要对容器的一些关键系统或程序文件进行修改,比如/etc、/bin目录等。Aqua Security可以通过Runtime Profile来做到这点2. 设置对/etc目录的只读后,以root用户运行容器仍旧无法对/etc目录下的任何文件进

19、行修改。运行命令为docker run -it runtime/file /bin/sh,之后vi /etc/hostname修改文件会有如下报错5.3 限制容器运行时的可执行命令1. 限制用户在容器运行时的可执行命令是十分重要的,其能有效避免一些误操作所带来的严重后果。Aqua Security可通过Runtime profile里的Allowed Executables来设置容器运行时的可执行命令白名单,如下图我们只允许执行/bin/bash命令。2. 当用户试图执行ls命令时,得到Permission denied的报错,同时Aqua Security处也有对应Block日志。3. 当用

20、户在Allowed Executables处加上ls命令后,此命令即可正常在容器内执行。即使sh脚本中有相关命令也同样被禁止5.4 限制Container运行时的进出网络1. 对于Container运行时的对外通信,用户可以限制其进出网络,从而隔绝容器不必要的网络通信。用户可以在Aqua Security内Runtime profile的Network选项禁止对应镜像生成的Container的对外通信。2. 这样当Container内部尝试与外部网络通信时,就会失败。同时Aqua Security也会记录对应的Block事件。测试命令为docker run -it runtime/networ

21、k /bin/sh5.5 黄金镜像-保证Container不对容器内任何文件进行修改1. 针对一些黄金镜像,用户不希望容器对其进行任何修改。则我们可以在Aqua Security的runtime profile中的Container Engine Controls中勾选Read-only root file system。2. 用户尝试修改、新增、删除容器内的文件报错,无法进行增删改。测试语句docker run -it runtime/goldenimage /bin/sh5.6 限制Container不以特权模式运行1. 容器运行时如果加上-privileged参数,即会以特权模式运行,可

22、访问Host上的所有设备,此容器几乎与主机上其他运行的进程一样可访问主机资源,这将带来十分高的安全风险。所以我们可以通过Aqua Runtime Profile里的配置禁用特权模式运行容器。2. 设置后,当用户再次想以特权模式运行容器时得到Blocked by runtime profile的报错,同时Aqua Audit日志里也有相关Block信息,测试命令为docker run -it -privileged runtime/nonprivileged /bin/sh 。5.7 限制Container挂载的数据卷1. 挂载数据卷是Container容器间分享永久数据的一种方式,这些永久数据

23、通常都会影响应用运行时的配置,一些误操作的写入可能会导致Container内的应用无法正常运行,所以针对挂载数据卷的限制也是十分必要的。我们可以通过Aqua Runtime Profile里的Allowed volumes配置来指定Container运行时允许挂载的数据卷及其写入读取权限。2. 当用户想要挂载其他数据卷时,得到Blocked by runtime profile的报错。同样当用户想要以ReadWrite权限挂载时也会报错,运行语句为docker run -rm -it -v /data:/data runtime/volumes /bin/sh 。必须指定ro权限才能正确挂载,

24、运行语句为docker run rm -it -v /data:/data:ro runtime/volumes /bin/sh。5.8 自主学习并生成安全规则1. 有时我们自定义的规则无法满足一些复杂的Container运行情景,此时我们可以让Aqua进行自主学习,其会根据指定image生成的Container运行情况,自动生成对应的Container运行规则。如下图,我们在Aqua System及image级别开启了自动Profile生成。2. 待配置的10分钟学习时间过后,Aqua即会根据之前Container运行的情况,自动生成对应的运行规则,用户可在此基础上再进行自定义调整。5.9

25、限制容器运行时使用的资源及进程数1. 通过Aqua的runtime profile可以对容器使用的CPU、内存及进程数进行限制,比如下图限制容器只能运行10个以内的进程。2. 运行docker run -d threattest/process 就会报错,此容器启动会自动开启超过10个ping命令进程,进入容器内部执行其他进程也都会被拒绝。在audit内有Block的日志.5.10 环境变量加密1. 通过Aqua的Runtime Profile的Environment Variables内可以启用环境变量加密2. 执行docker run -d -it -e password=test123

26、-name encrypttest runtime/encryptenv /bin/sh3. 执行docker inspect encrypttest|grep password得到加密密文4. 执行docker exec -it encrypttest /bin/bash进入容器后执行env命令才能看到变量的真实值6. 网络控制6.1 容器与Host之间网络限制1. 运行docker run -it -v /opt/aquatest:/usr/share/nginx/html:ro -p 80:80 -name nginxweb -d networktest/nginxweb生成测试容器,可

27、直接通过http:/访问到发布的页面2. 登录Aqua Container Firewall,点击已有NginxWebHost策略,对80端口做策略限制中的IP换成你的测试用主机IP后保存3. 点击ServicesAdd New Service新建服务,取名为NginxWeb。将步骤1正在运行的容器添加进去,同时防火墙策略选择步骤2中NginxWebHost即可。这样在指定测试主机访问http:/页面即失败,在Audit页面可查看对应Block日志6.2 容器与容器间的网络限制1. 保留章节6.1中的Service及容器,运行另一个centos容器docker run -it -d -name

28、 centosweb centos /bin/bash,进入到容器内部可访问之前nginxweb容器的页面docker exec -it centosweb /bin/bashcurl http:/2. 登录Aqua Container Firewall,点击已有NginxWebContainer策略,其已对NginxWeb服务做了80端口的访问限制,无需做任何修改。3. 点击ServicesAdd New Service新建服务,取名为CentosWeb。将步骤1正在运行的centosweb容器添加进去,同时防火墙策略选择步骤2中NginxWebContainer即可。这样再次进入到cent

29、osweb容器内部访问http:/页面即失败,在Audit页面可查看对应Block日志7. 主机权限管控7.1 角色权限管控1. Aqua页面User Access Control下已有CustomImageOperator策略,其定义imageoperator用户对所有container、image拥有Docker User权限(只能run或审计,不能commit) 2. 通过以下命令在Docker Host主机上新建用户并加入到Docker用户组useradd imageoperatorpasswd imageoperatorusermod -G docker imageoperator3

30、. Su到Imageoperator用户,运行docker image、docker run -rm centos都成功,但如果执行docker commit centos uactest/centos则报权限不足而失败7.2 自定义Role角色1. Aqua页面User Access ControlManage access rolesAdd new roles,名字填写CustomAuditor,下方命令列表将所有Auditor相关命令都加入进去,同时加上exec命令2. Aqua页面User Access Control下已有CustomAuditor策略,其定义customaudito

31、r用户对所有container、image拥有CustomAuditor权限 (审计加上exec进入容器内部权限)3. 通过以下命令在Docker Host主机上新建用户并加入到Docker用户组useradd customauditorpasswd customauditorusermod -G docker customauditor4. su到customauditor用户,运行docker image、docker ps、docker exec -it /bin/bash都成功,但如果执行docker run -it centos /bin/bash则报权限不足而失败7.3 通过ima

32、ge的label来分发权限1. Aqua页面Images下,确保uactest/label镜像已被打上uaclabel的标签2. Aqua页面User Access Control下已有Customlabeladmin策略,其定义labeladmin用户对标签为uaclabel 的镜像及其容器有所有执行权限。3. 通过以下命令在Docker Host主机上新建用户并加入到Docker用户组useradd labeladminpasswd labeladminusermod -G docker labeladmin4. Su到labeladmin用户,运行docker run -it uacte

33、st/label /bin/bash成功,但如果执行docker run -it centos /bin/bash则报权限不足而失败8. 其他8.1 Rootplease容器修改主机配置文件1. 在Docker Host主机上使用useradd root1和passwd root1新增root1用户并设置密码,其为普通用户,无法执行passwd root命令2. 执行docker run -v /:/hostOS -i -t -name rootplease chrisfosterelli/rootplease开启容器3. 执行docker exec -it rootplease /bin/s

34、h进入容器内部,之后执行vi /etc/passwd将root1的UID和GID都改成0后保存4. 在Docker Host主机上, su到root1后,执行whoami显示为root用户,且能够执行passwd root命令。这样就验证了容器与Host主机root用户是共享为同一个。8.2 私有Registry搭建1. 运行docker run -d -p 5000:5000 -restart=always -name registry registry:2生成私有镜像容器2. 运行tag命令将现有本地镜像重命名为一个新的镜像,比如:docker tag centos :5000/cento

35、s3. 执行docker push :5000/centos将步骤2生成的镜像推送到私有Registry中去4. 可通过网页http:/:5000/v2/_catalog 查看已经推送成功的镜像文件如果push的时候报http: server gave HTTP response to HTTPS client的错误,则在报错的docker host主机上修改/etc/docker/文件,在其内加上如下标红内容,如之前已有其他条目则以逗号分隔比如 alreadyexist:value,insecure-registries:5000 5. 保存后service docker restart重启

36、服务即可6. 搭建成功后可通过SystemIntegrationsRegistryAdd new Registry将新建的私有Registry与Aqua绑定。7. 最后需确保Host内Registry对应主机的Allow Regsitries内已添加了步骤6新建的私有Registry,这样aqua agent才能从中pull镜像来使用。8.3 Swarm部署Aqua Agent1. Aqua网页端HostsBatch Install,按需填写点击Create Batch2. 选择Swarm安装方式,将下方运行语句复制并在swarm管理节点运行3. 在swarm管理节点上运行docker ser

37、vice ls查看aqua-agent服务的运行状态。同时Aqua网页端Hosts会陆续刷新出swarm各节点的agent状态。如果发现某个agent长期处于pending状态,可选中后点击上方的Approve按钮即可8.4 Rancher部署Aqua Agent8.4.1 相关镜像获取1. 如果Aqua Agent和Server镜像通过Docker Hub下载,则登录RancherInfrastructureRegistriesAdd Registry,选择Docker Hub和可以获取相关镜像的hub用户名密码2. 如果是通过私有Registry下载,登录RancherInfrastruc

38、tureRegistriesAdd Registry,选择Customer,用户名密码可忽略8.4.2 Aqua Server与Aqua Agent都作为Rancher Service部署1. 首先在Rancher内部署Aqua Server端,通过RancherStacksAllAdd Stack,名字填写为Aqua-console,选择SVN里的aqua-consolerancher2.5.4.yml文件2. 确保其后生成的gateway、server、db三个容器都为Active状态,3. 登录http:/:18080 进入部署的Aqua Console端,创建Batch Install

39、,将Batch Install生成语句的Aqua_Token与Aqua_Server参数记录下来4. 登陆RancherInfrastructureContainersAdd Container,image填写aquasec/agent:2.5.45. 环境变量添加如下3条,其中Aqua_token和Aqua_server参数的值即参考步骤3中生成语句的对应值6. 添加Volumes和勾选Privilege模式7. 网络模式保持默认为Managed模式8. 点击生成等待容器生成即可。可登录http:/:18080进入hosts页面查看客户端通信情况8.4.3 只有Aqua Agent作为Ran

40、cher Service部署1. 当Aqua Server是独立部署,只有Aqua Agent作为Rancher Service部署时,步骤与8.4.1类似。首先登陆独立的Aqua Server创建Batch Install,将Batch Install生成语句的Aqua_Token与Aqua_Server参数记录下来2. 登陆RancherInfrastructureContainersAdd Container,各必要参数同章节8.4.1,其中Aqua_token和Aqua_server参数的值即参考步骤1中生成语句的对应值3. 注意在networking页面,网络务必选择Bridge类型

41、,及为对应Rancher Node主机的桥接网络,故需确保对应Rancher Node主机与Aqua Server之间的3622网络通信正常。4. 之后耐心等待Agent容器生成,可在对应Rancher Node主机上运行docker logs 查看其与Server通信日志是否正常8.5 调整容器内时区1. 容器运行时默认都是美国时区,这在设置Aqua定期扫描时间、Registry定期扫描时间时会有差异。故可以在容器运行时加上-v /etc/localtime:/etc/localtime:ro参数,保证容器内时区与docker host主机时区保持一致。在Aqua Agent生成语句中可手动

42、加上此参数。Aqua Server端已在文件内加上对应参数。8.6 更换镜像及容器保存路径有时docker host的/var路径的挂载盘会因为容器及镜像文件保存过多而剩余空间低,此时可以考虑将/var/lib/docker文件夹迁移到磁盘剩余空间大的路径,同时生成软链接来映射两者关系,具体步骤如下(其中/mnt/docker即为新的保存路径):1. 停止 Docker: service docker stop.2. 做个备份 (非必要) tar -zcC /var/lib/docker /mnt/var_lib_docker-backup-$(date + %s).3. 迁移/var/lib/docker目录到mnt 目录下: mv /var/lib/docker /mnt/docker4. 建个 symlink: ln -s /mnt/docker /var/lib/docker5. 确认文件夹类型为symlink 类型 ls /var/lib/docker6. 启动 docker service: service docker start

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号