質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

proxy

proxy(プロキシー)は、企業などの内部コンピュータとインターネットの中間に位置し、例えば直接インターネットに接続できない内部コンピュータの代理としてインターネットに接続する等をするシステム、もしくは代理として機能を実行するソフトウェアです。内部ネットワークへのアクセスを一元管理し、内部からの特定の種類の接続以外を遮断すること、外部からの不正アクセスを拒否することなどに用いられます。

Q&A

解決済

1回答

707閲覧

【Docker】proxyサーバを非rootで立ち上げたい

pipo

総合スコア16

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

proxy

proxy(プロキシー)は、企業などの内部コンピュータとインターネットの中間に位置し、例えば直接インターネットに接続できない内部コンピュータの代理としてインターネットに接続する等をするシステム、もしくは代理として機能を実行するソフトウェアです。内部ネットワークへのアクセスを一元管理し、内部からの特定の種類の接続以外を遮断すること、外部からの不正アクセスを拒否することなどに用いられます。

0グッド

1クリップ

投稿2018/12/13 13:41

Dockerを用いてproxyサーバを立ち上げようとしています。
rootのまま作業するのは良くないと書き込みを見て、ユーザを作成してそれで運営していこうと考えたのですが、非rootでの構築の仕方が分からず困っています。

80番ポートは一般ユーザでは使えないとのことも知って、対応してみたつもりですがうまくいきませんでした。
アドバイスよろしくお願いします。

▼エラー内容

2018/12/09 23:38:30 [emerg] 1#1: bind() to 0.0.0.0:80 failed (13: Permission denied) nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)

8081ポートを使うようとして、以下のような感じで構成しています。

nginxの設定ファイルは2つ用意していて、
./proxy/nginx.conf
./proxy/conf.d/default.conf
を使用しています。

このうち、listenは
./proxy/conf.d/default.confで指定しています。

▼docker-compose

version: "3" services: proxy: build: ./proxy container_name: my_proxy volumes: - ./proxy/conf.d:/etc/nginx/conf.d - ./proxy/nginx.conf:/etc/nginx/nginx.conf - ./proxy/html:/usr/share/nginx/html links: - nginx:nginx ports: - 80:8081 environment: TZ: "Asia/Tokyo"

▼nginx.conf

# user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; proxy_cache_path /var/cache/nginx/proxy_cache levels=1:2 keys_zone=proxy:10m max_size=1g inactive=1d; proxy_temp_path /var/cache/nginx/temp 1 2; upstream myapp { server nginx:8080; } }

▼default.conf

server { listen 8081; charset utf-8; server_name localhost; location / { proxy_pass http://myapp; proxy_redirect default; root /usr/share/nginx/html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }

▼Dockerfile

FROM nginx # ディレクトリオーナーをwww-dataに変更 RUN touch /var/run/nginx.pid && \ chown -R www-data:www-data /var/run/nginx.pid && \ chown -R www-data:www-data /var/cache/nginx USER www-data CMD ["nginx", "-g", "daemon off;","-c","/etc/nginx/nginx.conf"]

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ockeghem

2018/12/14 06:54

「rootのまま作業するのは良くないと書き込み」の真意を知りたいので、URL等がわかれば教えてください
pipo

2018/12/16 05:19

ありがとうございます。 「rootのまま作業するのは良くないと書き込み」と書いてしまいましたが、 こちらは書籍の方に書いてあったものでURLはありませんが、 オライリーの「Docker」という本の中で 「実働アプリケーションをコンテナ内でrootとして動かしてはいけません。アプリケーションの防御を破った攻撃者は、コンテナへの完全なアクセスを得てしまうでしょう。これには、コンテナのデータとプログラムの両方が含まれます。さらに悪いことには、コンテナから外へ出ることに成功した攻撃者は、ホスト上でrootアクセス権限を持つことになります」 と注意書きがありました。 自分はまだセキュリティに関しての知識がないので、注意書きされていることを完全に理解できたわけではないのですが、とりあえず従っておこうと思い、rootで運営はやめようと思いました。
guest

回答1

0

ベストアンサー

以下のエラーメッセージから判断するに、80ポートで待受をしているように見受けられます。

2018/12/09 23:38:30 [emerg] 1#1: bind() to 0.0.0.0:80 failed (13: Permission denied)
nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)

bind() to 0.0.0.0:80 failed (13: Permission denied) でGoogle検索すると、以下の質問が見つかりました。

【Docker】nginxを立ち上げ時に0.0.0.0:80 failed (13: Permission denied)

この質問は回答がついていませんが、コメント欄に以下があり、この状況だったようです。

conf.d/ 以下に default.conf 以外のファイルがあって、"listen 80" になっていませんでしょうか?

これに対する返答は以下のとおりです。

バックアップ用にdefault.conf_bk_defというファイルを置いており、その中身が"listen 80"でした。
nginx.conf内の"include /etc/nginx/conf.d/*.conf;"
という記述は.confで終わるファイルを読み込むものだと思い込んでいたので影響はないかと考えていたのですが試しにのけてみたらうまくいきました!

また、以下のコメントにあるように、masterプロセスを root で動かすことはごく一般的な運用だと思います。

master プロセスだけ root で動かしてもいいと思いますが。

というのは、実際に通信を処理するのはworkerプロセスで、こちらは非root(www-dataなど)で動作するためです。乗っ取られるとすると、workerプロセス側であり、この場合はrootユーザーがとられるわけではありません。masterプロセスが乗っ取られるというケースは、ちょっと聞いたことがないですね。
これが、Tomcatなどだと話は別で、rootで起動するとrootのままで動いてしまうので、rootユーザーが乗っ取られるケースはたまにあります。
ということで、nginxのmasterプロセスがrootで動作するのは、そこまで神経質になる必要はないと思います。

投稿2018/12/16 06:19

ockeghem

総合スコア11701

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pipo

2018/12/16 06:54

なるほど! 解決方法だけでなく、運用方法まで助言いただきありがとうございました! とても参考になります。 (一応、参考にいただいた質問内容で、こちらの問題も解決しました!) セキュリティに関しての知識が乏しすぎるため、確かに神経質になっていました。 dockerというより、サーバ全体の勉強をもっとする必要がありそうです。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問