
給出: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 用戶身份運行此應用程序,因為在某個時間點我可能決定在該計算機上以不同用戶身份運行另一個 Web 伺服器,僅向 http 用戶公開其 .sock 文件。眾所周知,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
將您的 sock 檔案放入/var/run
,並在建立 sock 檔案時檢查它屬於哪個使用者和群組。對於您的情況,用戶應該是“app”