在CentOS或Ubuntu服务器中,多个应用共用同一台机器需要做哪些隔离措施?

在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命名空间 + 网络策略
极致隔离 合规要求严格 虚拟机 + 物理隔离

快速实施清单:

  1. ✅ 为每个应用创建独立系统用户
  2. ✅ 分离数据、日志、配置目录
  3. ✅ 使用容器(Docker/Podman)封装应用
  4. ✅ 配置cgroups资源限制
  5. ✅ 设置应用专用防火墙规则
  6. ✅ 分离监控指标和日志收集
  7. ✅ 定期审计权限和资源使用

最佳实践建议:对于新项目,优先考虑容器化部署(Docker/Kubernetes),这是目前最成熟的多应用隔离方案。对于遗留应用,可逐步实施用户隔离和资源限制。

云服务器