在CentOS/Ubuntu服务器上实现多应用隔离,建议采用分层隔离策略:
一、基础系统隔离
1. 用户与权限隔离
# 为每个应用创建独立用户和组
sudo useradd -r -s /sbin/nologin app1_user
sudo useradd -r -s /sbin/nologin app2_user
# 设置目录权限
sudo chown -R app1_user:app1_group /opt/app1
sudo chmod 750 /opt/app1
2. 文件系统隔离
# 使用专用目录结构
/opt/
├── app1/
│ ├── data/ # 应用数据
│ ├── logs/ # 应用日志
│ └── config/ # 配置文件
└── app2/
├── data/
├── logs/
└── config/
# 或使用绑定挂载
sudo mount --bind /opt/app1/data /var/lib/app1_data
二、进程与资源隔离
1. cgroups (CentOS 7+/Ubuntu)
# 使用systemd创建cgroup
sudo systemd-run --unit=app1 --scope
--slice=app-slice1
--property=CPUQuota=50%
--property=MemoryLimit=1G
/opt/app1/start.sh
2. 资源限制配置文件
# /etc/systemd/system/app1.service.d/limits.conf
[Service]
CPUQuota=50%
MemoryLimit=1G
MemorySwapMax=0
BlockIOWeight=500
三、网络隔离
1. 端口与防火墙
# 每个应用使用不同端口
app1: 8080-8089
app2: 8090-8099
# 使用firewalld/iptables限制访问
sudo firewall-cmd --permanent --add-rich-rule='
rule family="ipv4"
source address="192.168.1.0/24"
port protocol="tcp" port="8080" accept'
2. 网络命名空间(高级)
# 创建网络命名空间
sudo ip netns add app1_net
sudo ip netns exec app1_net ip link set lo up
四、应用层隔离
1. 容器化方案
# Docker容器(推荐)
docker run -d --name app1
--cpu-quota 50000
--memory 1g
--network mynetwork
-v /opt/app1/data:/data
app1:latest
# Podman(无守护进程)
podman run --userns=keep-id ...
2. 虚拟环境
# Python virtualenv
python -m venv /opt/app1/venv
source /opt/app1/venv/bin/activate
# Node.js环境
nvm install 14
nvm use 14
五、配置与依赖隔离
1. 环境变量隔离
# 使用systemd环境文件
# /etc/systemd/system/app1.service.d/env.conf
[Service]
Environment="APP1_DB_HOST=localhost"
Environment="APP1_SECRET_KEY=xxx"
2. 配置文件隔离
# 每个应用独立配置目录
/etc/
├── app1/
│ ├── app1.conf
│ └── secrets/
└── app2/
├── app2.conf
└── certificates/
六、监控与日志隔离
1. 日志管理
# 使用rsyslog分离日志
# /etc/rsyslog.d/10-app1.conf
if $programname == 'app1' then /var/log/app1/app1.log
& stop
2. 监控分离
# Prometheus配置
- job_name: 'app1'
static_configs:
- targets: ['localhost:9101']
- job_name: 'app2'
static_configs:
- targets: ['localhost:9102']
七、安全加固
1. SELinux/AppArmor
# CentOS SELinux
semanage fcontext -a -t httpd_sys_content_t "/opt/app1(/.*)?"
restorecon -Rv /opt/app1
# Ubuntu AppArmor
aa-genprof /opt/app1/bin/app1
2. 文件系统安全
# 使用noexec, nosuid挂载选项
/dev/sdb1 /opt/app1/data ext4 defaults,noexec,nosuid 0 0
八、推荐架构方案
方案选择建议:
| 隔离级别 | 适用场景 | 推荐技术 |
|---|---|---|
| 基础隔离 | 少量可信应用 | 用户隔离 + 目录分离 |
| 中等隔离 | 生产环境多应用 | Docker容器 + 资源限制 |
| 高级隔离 | 多租户/安全敏感 | Kubernetes命名空间 + 网络策略 |
| 极致隔离 | 合规要求严格 | 虚拟机 + 物理隔离 |
快速实施清单:
- ✅ 为每个应用创建独立系统用户
- ✅ 分离数据、日志、配置目录
- ✅ 使用容器(Docker/Podman)封装应用
- ✅ 配置cgroups资源限制
- ✅ 设置应用专用防火墙规则
- ✅ 分离监控指标和日志收集
- ✅ 定期审计权限和资源使用
最佳实践建议:对于新项目,优先考虑容器化部署(Docker/Kubernetes),这是目前最成熟的多应用隔离方案。对于遗留应用,可逐步实施用户隔离和资源限制。
CLOUD技术笔记