温馨提示×

centos lnmp如何进行权限管理

小樊
36
2025-12-29 11:11:38
栏目: 智能运维

CentOS LNMP 权限管理实操指南

一 核心原则

  • 最小权限原则:各组件以非 root运行,按“Nginx 只读静态资源、PHP-FPM 写上传与缓存、数据库最小权限”划分能力边界。
  • 身份与组分离:为 Web 服务创建专用用户与组(如 webuser),Nginx、PHP-FPM 统一以该身份运行,便于权限收敛与审计。
  • 权限最小化:目录多用750,文件多用640,敏感配置600;上传目录禁止执行;必要时用 ACL 做细粒度授权。
  • 强化周边:启用 firewalld 仅开放 22/80/443(数据库端口仅内网),禁用 root 远程登录,定期更新与审计。

二 用户与运行身份

  • 创建专用 Web 用户与组(示例:webuser):
    • 创建用户:sudo adduser -r -s /sbin/nologin webuser
    • 将站点目录属主设为 webuser:sudo chown -R webuser:webuser /var/www/html
  • Nginx 运行身份:
    • 编辑 /etc/nginx/nginx.confuser nginx;(或统一改为 webuser 以便与 PHP-FPM 一致)
    • 重启:sudo systemctl restart nginx
  • PHP-FPM 运行身份与池配置:
    • 编辑 /etc/php-fpm.d/www.confuser = webusergroup = webuser
    • 与 Nginx 通信套接字权限(按需):listen.owner = nginxlisten.group = nginxlisten.mode = 0660
    • 重启:sudo systemctl restart php-fpm
  • 数据库运行身份(系统层):
    • 确保 /var/lib/mysql 属主为 mysql:mysqlsudo chown -R mysql:mysql /var/lib/mysql
    • 权限建议:750(仅 mysql 组可读写执行)

三 文件与目录权限落地

  • 标准站点目录(示例:/var/www/html):
    • 目录:find /var/www/html -type d -exec chmod 750 {} \;
    • 文件:find /var/www/html -type f -exec chmod 640 {} \;
    • 属主:sudo chown -R webuser:webuser /var/www/html
  • 上传目录(示例:/var/www/html/uploads):
    • 禁止脚本执行:chmod 750 /var/www/html/uploads
    • 仅 webuser 可写:chown webuser:webuser /var/www/html/uploads
  • 敏感配置与密钥:
    • Nginx、PHP、数据库配置等:chmod 600 /path/to/config
    • 私钥(如 /etc/pki/tls/private/*.key):chmod 600 且仅 root 可访问
  • 需要跨用户协作时,用 ACL 精确授权(示例:给 deploy 用户读取站点目录):
    • 设置:setfacl -R -m u:deploy:rX /var/www/html
    • 查看:getfacl /var/www/html
  • 权限速查表:
    • 目录:750(rwxr-x—)适合代码与上传目录
    • 文件:640(rw-r-----)适合源码、静态资源
    • 配置:600(rw-------)适合密钥与敏感配置
    • 临时上传:600(rw-------)并隔离执行权限

四 数据库与网络权限

  • 数据库账户最小权限:
    • 登录:mysql -u root -p
    • 创建应用用户(仅本地):CREATE USER 'webuser'@'localhost' IDENTIFIED BY 'StrongPass!';
    • 授权最小集:GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'webuser'@'localhost';
    • 刷新:FLUSH PRIVILEGES;
  • 远程访问策略:
    • 默认仅本地:bind-address = 127.0.0.1(如需远程仅对受控网段开放)
    • 防火墙仅内网放行 3306sudo firewall-cmd --permanent --zone=internal --add-port=3306/tcp && sudo firewall-cmd --reload
  • 安全基线:
    • 运行 sudo mysql_secure_installation 完成 root 强口令、匿名用户移除、测试库删除与远程 root 禁用

五 SELinux 与防火墙

  • SELinux(默认启用,优先用策略而非关闭):
    • 状态检查:sestatus
    • 目录上下文(示例将站点目录标记为 httpd 可读):
      • sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/html(/.*)?"
      • sudo restorecon -Rv /var/www/html
    • 特定访问需求(如允许 Nginx 连接数据库):sudo setsebool -P httpd_can_network_connect_db 1
    • 临时禁用仅用于排障:sudo setenforce 0(生产不建议)
  • 防火墙(firewalld):
    • 放行 Web:sudo firewall-cmd --permanent --zone=public --add-service=http --add-service=https && sudo firewall-cmd --reload
    • 仅内网放行数据库:sudo firewall-cmd --permanent --zone=internal --add-port=3306/tcp && sudo firewall-cmd --reload
  • 风险提示:关闭 SELinux 或过度放宽策略会降低系统安全,优先使用正确的类型与布尔值配置

0