CentOS 8 에서 Nginx Permission Denied 문 제 를 해결 합 니 다.

5101 단어 LinuxDjango
배경
최근 서버 를 되 돌 릴 때 는 CentOS 8 운영 체 제 를 선 택 했 는데, 설정 Nginx 를 설치 하 던 중 Permission Denied 문제 가 발생 했다.chown 과 chmod 에 따라 설정 이 완료 되 지 않 았 으 며, 나중에 SELinux 문 제 를 찾 았 습 니 다.
SELinux 가 뭐 예요?
When you upgrade a running system to Red Hat Enterprise Linux (RHEL) 6.6 or CentOS 6.6, the Security Enhanced Linux (SELinux) security permissions that apply to NGINX are relabelled to a much stricter posture. Although the permissions are adequate for the default configuration of NGINX, configuration for additional features can be blocked and you need to permit them explicitly in SELinux. This article describes the possible issues and recommended ways to resolve them.
Nginx 설치
다음 설정 에 따라 nginx 를 정상적으로 시작 하고 nginx 의 환영 페이지 에 접근 할 수 있 습 니 다.

#   
sudo yum install -y nginx
#   
systemctl start nginx.service

사용자 정의 설정
프로필 주소:
/etc/nginx/nginx.conf
사용자 정의 프로필 은 보통 conf. d 디 렉 터 리 에 놓 습 니 다.
$nginx_conf/conf.d/default.conf
사용자 정의 항목 설정 추가
server {
    listen       8081;
    server_name  localhost;

    access_log  /var/log/nginx/access.log  main;

    location / {
      root   /home/custom/web;   #      
      index  index.html index.htm;
    }
}

이 때 nginx 프로그램 을 다시 시작 하면 정상적으로 시작 할 수 없습니다.
systemctl start nginx

따라서 nginx 명령 으로 시작 하여 정상적으로 시작 되 었 으 나 페이지 에 접근 하 는 데 403 권한 문제 가 발생 했 습 니 다.
nginx # nginx    

403 권한 문제 로그, 로그 정 보 를 볼 수 있 습 니 다.
2018/09/18 23:41:37 [error] 1266#1266: *1 "/home/custom/web/index.html" is forbidden (13: Permission denied), client: xxx.xxx.xxx.xxx, server: localhost, request: "GET / HTTP/1.1", xxx.xxx.xxx.xxx:8081"

인터넷 을 통 해 자 료 를 찾 으 면 루트 사용자 로 시작 하 는 것 이 해결 방법 입 니 다.nginx. conf 파일 을 수정 해 야 합 니 다.
# /etc/nginx/nginx.conf

#user  nginx;
user  root;
worker_processes  1;
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
	......
}

SELinux 에서 어떻게 설정 합 니까?
이렇게 루트 사용자 로 프로그램 을 시작 하면 생산 환경 에서 강력 히 건의 하지 않 고 매우 큰 안전 문제 가 존재 합 니 다.그래서 SELinux 가 열 리 면 어떻게 설정 하 는 지 계속 연구 해 야 합 니 다.
기본 창고 에서 nginx 는 정상적으로 작 동 할 수 있 습 니 다.파일 경로 정보 보기,
ll -Zd /usr/share/nginx/html/

# drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /usr/share/nginx/html/

그 중, systemu:object_r:httpd_sys_content_t: s0 은 현재 경로 의 보안 컨 텍스트 설정 입 니 다.chcon 명령 을 통 해 새 디 렉 터 리 주소 설정 을 설정 합 니 다.
chcon -Ru system_u /home/custom/web
chcon -Rt httpd_sys_content_t /home/custom/web

이 때 user 를 nginx 로 설정 하고 SELinux 를 닫 으 면 정상적으로 접근 할 수 있 습 니 다.
setenforce 0
systemctl start nginx

그러나 SELinux 를 열 때 다음 오류 로그 가 시 작 됩 니 다.
[root@localhost mgzy]# systemctl start nginx
Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.
[root@localhost mgzy]# systemctl status nginx.service
● nginx.service - nginx - high performance web server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since   2018-09-19 03:07:23 CST; 7s ago
     Docs: http://nginx.org/en/docs/
  Process: 12298 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=1/FAILURE)

9  19 03:07:23 localhost.localdomain systemd[1]: Starting nginx - high performance web server...
9  19 03:07:23 localhost.localdomain nginx[12298]: nginx: [emerg] open() "/etc/nginx/none" failed (13: Permission denied)
9  19 03:07:23 localhost.localdomain systemd[1]: nginx.service: control process exited, code=exited status=1
9  19 03:07:23 localhost.localdomain systemd[1]: Failed to start nginx - high performance web server.
9  19 03:07:23 localhost.localdomain systemd[1]: Unit nginx.service entered failed state.
9  19 03:07:23 localhost.localdomain systemd[1]: nginx.service failed.

로그 에서 / etc / nginx / none 파일 을 보고 어리둥절 하지만 Permission denied 설명 은 권한 문제 입 니 다.이 때 nginx 를 통 해 시작 하면 none 파일 을 만 들 수 있 습 니 다.이 때 다음 명령 을 실행 해 야 합 니 다.
# make the process type httpd_t permissive
semanage permissive -a httpd_t

이로써 SELinux 에서 nginx 를 설정 하면 정상적으로 작 동 할 수 있 습 니 다.
기타 설명
다음 명령 을 통 해 nginx 가 의존 하 는 안전 정 보 를 볼 수 있 습 니 다.
# grep nginx /var/log/audit/audit.log | audit2allow -m nginx

module nginx 1.0;

require {
	type httpd_t;
	type unreserved_port_t;
	type httpd_config_t;
	class tcp_socket name_bind;
	class file { append create };
	class dir { add_name write };
}

#============= httpd_t ==============
allow httpd_t httpd_config_t:dir { add_name write };
allow httpd_t httpd_config_t:file { append create };

참고 자료
  • https://blog.csdn.net/aqzwss/article/details/51134591
  • https://linux.die.net/man/8/httpd_selinux
  • http://man.linuxde.net/semanage
  • https://www.getpagespeed.com/server-setup/nginx/nginx-selinux-configuration
  • 좋은 웹페이지 즐겨찾기