
주어진 내용: DigitalOcean의 새로운 Archlinux VPS 상자. 사용자 'app'을 생성했는데 /home/app/webapp.sock
systemd가 시작한 바이너리로 생성된 파일이 있습니다.
[Unit]
Description=Web application server
After=network.target
[Service]
Type=forking
User=app
PIDFile=/home/app/webapp.pid
ExecStart=/home/app/.gem/ruby/2.0.0/bin/thin -d --user app -e production --chdir /home/app/app --socket /home/app/webapp.sock --pid /home/app/webapp.pid --log /home/app/log/webapp.log start
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -QUIT $MAINPID
[Install]
WantedBy=multi-user.target
이 앱을 http 사용자로 실행하고 싶지는 않습니다. 어느 시점이 되면 해당 컴퓨터에서 다른 사용자로 다른 웹 서버를 실행하여 해당 .sock 파일만 http 사용자에게 노출하기로 결정할 수 있기 때문입니다. Rails에는 보안 결함이 있는 것으로 알려져 있으므로 '앱' 사용자가 자신의 홈 폴더와 자체 데이터에 접근하는 것을 방지하고 싶습니다.
sudo 사용자 'sudoer'가 있는데 pid 파일조차 읽을 방법이 없습니다.
[sudoer@host ~]$ cat /home/app/webapp.pid
cat: /home/app/webapp.pid: Permission denied
[sudoer@host ~]$ sudo su - app
[app@host ~]$ ls -l webapp.pid
-rw-r--r-- 1 app app 5 Dec 7 19:33 webapp.pid
'다른 사람'에 대한 'r' 권한이 있는데 왜 'sudoer'가 'cat'할 수 없습니까?
나는 이것이 다음 nginx 오류의 원인이라고 가정합니다. 정적 파일:
2013/12/07 18:58:05 [error] 18114#0: *2 open() "/home/app/app/public/favicon.ico" failed (13: Permission denied), client: 183.89.50.151, server: host.com, request: "GET /favicon.ico HTTP/1.1", host: "host.com"
동적 콘텐츠:
2013/12/07 20:49:00 [crit] 21581#0: *1 connect() to unix:/home/app/webapp.sock failed (13: Permission denied) while connecting to upstream, client: 183.89.50.151, server: host.com, request: "GET /favicon.ico HTTP/1.1", upstream: "http://unix:/home/app/webapp.sock:/favicon.ico", host: "host.com"
nginx 구성에서 발췌:
upstream webapp {
server unix:/home/app/webapp.sock fail_timeout=0;
}
server {
listen 80;
root /home/app/app/public;
보안이 강화된 걸까요? SELinux? C그룹? 내가 도대체 뭘 잘못하고있는 겁니까?
답변1
소켓(파일)뿐만 아니라 모든 상위 디렉터리의 권한을 확인해야 합니다. 만약에어느그 중 액세스가 거부되면 요청이 실패합니다.
예를 들어:
# ls -ld /home/app
drwx------. 8 root root 4096 Dec 7 21:33 /home/app
답변2
양말 파일을 넣고 /var/run
양말 파일이 생성되면 어느 사용자와 그룹에 속하는지 확인하십시오. 귀하의 경우 사용자는 'app'이어야 합니다.