centos 7 yum nginx non-root user selinux

2130阅读 0评论2016-09-07 yjd333
分类:LINUX

最近开一个对外的nginx反向,使用了selinux。发这里存档。

1,增加官方源使用rpm安装。需要功能不多没采用源码编译。
  1. vi /etc/yum.repos.d/nginx.repo
  2. [nginx]
  3. name=nginx repo
  4. baseurl=
  5. gpgcheck=0
  6. enabled=1
  1. 或直接安装rpm:
  2. rpm -Uvh

2,安装 yum install nginx  (默认已建nologin类的nginx帐号)
3,修改服务文件
  1. vi /usr/lib/systemd/system/nginx.service
  2. [Service]
  3. User=nginx //使用nginx启动进程
  4. LimitNOFILE=12000
  5. PIDFile=/var/log/nginx/nginx.pid //修改到和日志同目录(方便后面非root用户运行se策略控制) 或 直接删除由nginx.conf里指定
4,注释掉 /etc/nginx/nginx.conf 第一行,并修改日志目录权限
  1. #user nginx;
  2. chown nginx:root /var/log/nginx   //修改权限

5,重启nginx服务器  systemctl restart nginx  ,报错被se策略拦了。
  1. open() "/var/log/nginx/nginx.pid" failed (13: Permission denied)
 解决1 导入模块(semodule -l |grep xxx 查看模块
  1. 查看audit日志并设置selinux
  2. grep nginx /var/log/audit/audit.log | audit2allow -M nginx-pid //如缺少命令需要安装 yum install policycoreutils-python
  3. cat nginx-pid.te
  4. allow httpd_t httpd_log_t:file write //httpd_log_t //类型需要写权限
  5. semodule -i nginx-pid.pp //导入
解决2 自己编写一个te文件(推荐):
  1. vi nginx-rwx.te
  2. -------------------------------------------------------------te内容
  3. #模块 nginx-rwx-httpd_log_t 名称
  4. module nginx-rwx-httpd_log_t 1.0;
  5. require {
  6. type httpd_log_t;
  7. type httpd_t;
  8. class dir { read remove_name setattr };
  9. class file { rename write unlink };
  10. }
  11. #============= httpd_t ==============
  12. #!!!! This avc is allowed in the current policy
  13. allow httpd_t httpd_log_t:dir { read remove_name setattr };
  14. allow httpd_t httpd_log_t:file { write unlink rename};
  15. --------------------------------------------------------------
  16. checkmodule -M -m -o nginx-rwx.mod nginx-rwx.te //-M启用mls兼容 -m 基本。载入te文件生成mod文件。
  17. semodule_package -o nginx-rwx.pp -m nginx-rwx.mod //mod转成pp文件
  18. semodule -i nginx-rwx.pp //载入模块
6,接续重启  systemctl restart nginx 报错:


  1. bind() to 0.0.0.0:28901 failed (13: Permission denied)
执行:semanage port -a -t http_port_t -p tcp 28901

7,再次重启nginx服务,运行正常。

访问反向代理出现目录权限错误


  1. mkdir() "/usr/share/nginx/proxy_cache" failed (13: Permission denied)
配置的缓存路径无法创建,手动创建并赋予权限:


  1. cd /usr/share/nginx && mkdir proxy_temp proxy_cache
  2. chown nginx:root proxy_* && chmod 770 proxy*
  3. chcon -u system_u proxy_*
报错


  1. open() "/usr/share/nginx/proxy_temp/0000000003" failed (13: Permission denied)

  2. ls -Z /usr/share/nginx/   //查看目录上下文
    drwxr-xr-x. root  root system_u:object_r:usr_t:s0       html
    drwxrwx---. nginx root unconfined_u:object_r:usr_t:s0   proxy_cache
    drwxrwx---. nginx root unconfined_u:object_r:usr_t:s0   proxy_temp

  3. chcon system_u:object_r:httpd_log_t:s0 proxy_*  //修改权限

  4. ls -Z /usr/share/nginx/   //再次查看 (我只做反向代理 html web主目录用不上,权限就不管了)
    drwxr-xr-x. root  root system_u:object_r:usr_t:s0       html
    drwxrwx---. nginx root system_u:object_r:httpd_log_t:s0 proxy_cache
    drwxrwx---. nginx root system_u:object_r:httpd_log_t:s0 proxy_temp

其他可能的错误 (上面导入te文件已经赋予权限我这里不会有如下错误)


  1. unlink() "/usr/share/nginx/proxy_temp/0000000004"
  2. rename() "/usr/share/nginx/proxy_temp/0000000004"
错误


  1. setrlimit(RLIMIT_NOFILE, 12000) failed (1: Operation not permitted)
引用: http://ospi.netcode.fi/blog/centos-7-raise-nofile-limit-for-nginx.html
查看nginx打开文件最大初始值是否生效:


  1. cat /proc/$(cat /var/log/nginx/nginx.pid)/limits|grep open.files
  2. \ps --ppid $(cat /var/log/nginx/nginx.pid) -o %p|sed '1d'|xargs -I {} cat /proc/{}/limits|grep open.files
如果没生效,需要在nginx服务文件里添加。参考上面第三项
另外: setsebool -P httpd_setrlimit 1

8,ulimit 设置部分:ulimit -a


  1. vi /etc/security/limits.conf
  2. * soft nofile 20000
  3. * hard nofile 20000
  4. * soft nproc 20000
  5. * hard nproc 20000
  6. vi /etc/pam.d/login
  7. session required /usr/lib64/security/pam_limits.so
9,systemctl enable nginx 设置开机启动

附:
  1. audit2allow -i /var/log/audit/audit.log //读入文件分析
  2. audit2allow -d //使用 -d 选项,可以接收 dmesg 的信息
  3. audit2allow -w -a //自动读audit.log并给出注释
  4. ausearch -m AVC --start 04/05/2016 19:52:00 --end 04/05/2016 19:52:59 | audit2allow -w //搜索范围内
  5. ausearch -m AVC --start 04/05/2016 19:52:00 --end 04/05/2016 19:52:59 | audit2allow -a -M test_rule //搜索范围并生成
  6. ausearch -m AVC | grep -E 'rename|module_request' | audit2allow -a //多字符匹配+去重
  7. audit2why
  8. .
  9. sesearch -A|grep "allow httpd_t httpd_log_t"  //查看策略权限


上一篇:PotPlayer 禁止联网 去联网补丁 禁止更新 2015.10.13 [x86 x64]
下一篇:F460 F452 获取超级密码 解决 LOID 注册断线 保留telnet 无需ttl 不用拔光纤