ECS的容器在ECI中没权限启动
在ECS的容器,有一行命令
su - ctf -c "nohup python3 /var/www/app.py &"
其中app.py的端口是80端口,在ECS里运行没问题,而当部署在ECI上运行就会提示Permission denied
,其原因是在类Unix系统(包括Linux容器)中,1-1023端口属于 “特权端口”,根据系统安全规范,只有root用户(或拥有特定权限的进程)才能绑定这些端口。
那为何ECS与ECI的差异为何导致不同结果?
ECS(弹性云服务器)本质是一台虚拟机,可能存在以下情况让ctf用户能绑定80端口:
- 预先给ctf用户赋予了
CAP_NET_BIND_SERVICE
(允许非 root 绑定特权端口); - 系统中存在端口转发规则(如
iptables
将80端口转发到非特权端口,app.py实际绑定的是高端口); - 虚拟机的安全策略较宽松(例如
sysctl
参数调整了特权端口限制)。
- 预先给ctf用户赋予了
ECI(弹性容器实例)是容器化环境,默认遵循更严格的安全隔离原则:
- 容器默认以非特权模式运行,root用户在容器内也可能被限制(如
--user
指定非root时,完全无特权); - 非root用户(ctf)默认没有
CAP_NET_BIND_SERVICE
能力,无法绑定80端口; - 容器的安全上下文(如
seccomp
、apparmor
配置)可能进一步限制了端口绑定权限。
- 容器默认以非特权模式运行,root用户在容器内也可能被限制(如
解决法子:
修改应用,使用非特权端口:将app.py的监听端口从80改为1024以上的端口(如 8080),非root用户可直接绑定。
给ctf用户添加
CAP_NET_BIND_SERVICE
能力
若必须使用80端口(或者修改为其他端口太麻烦),可在容器启动时为进程赋予CAP_NET_BIND_SERVICE
能力(允许非 root 绑定特权端口)。
apt-get update
apt-get install -y libcap2-bin
# setcap无法直接对符号链接生效,必须指向实际的二进制文件
setcap 'cap_net_bind_service=+ep' /usr/local/bin/python3.8