
条件: DigitalOcean 上の新しい Archlinux VPS ボックス。ユーザー「app」を作成しました。systemd/home/app/webapp.sock
によって起動されたバイナリによって作成されたファイルがあります。
[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 サーバーを実行し、その .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? CGroups? 何が間違っているのでしょうか?
答え1
ソケット(ファイル)だけでなく、すべての親ディレクトリの権限を確認する必要があります。どれでもアクセスを拒否された場合、リクエストは失敗します。
例えば:
# ls -ld /home/app
drwx------. 8 root root 4096 Dec 7 21:33 /home/app
答え2
sock ファイルを配置し/var/run
、sock ファイルが作成されたら、それがどのユーザーとグループに属しているかを確認します。この場合、ユーザーは「app」である必要があります。