してたらいいね。
ってことで今回はだいぶ迷走したUbuntu26ServerにDocker環境を用いたセキュアなサービス環境構築を目指します。何してるのかはGemini君に聞いてください。
続きを読む: Ubuntu26にセキュアなDocker環境を構築したいね環境紹介
- KAGOYA VPS : 6core / 8GB:mem / 800GB:NVMe –3410JPY/Month
- Ubuntu 26.4 server
- Docker compose v2
ひとまずこの状態で最新のソフトウェアアップデートを完了させます。ドメインはサブドメイン二つを使って、WEBから管理をできるようにしたいと思います。
ていうか、なんか巨大なグレートじゃない?って思った人もいるかもですが、Alfrescoを使ってみたかったものの、これまでのサーバでは起動すらできなかったので探したらさくらのVPSと同額で倍の性能のプランがあったため、仮に使ってみたもののそれでもなんか満足いく結果にならなかったので、さくらのVPSからデータを移行するついでにすべてをDockerでカプセルって行きたいなって思った次第。
そのために使うのがこちら
Nginx-Proxy-Manager
Nginxをウェブ上でいろいろいじくり倒せるようにするやつです。
ここから情報を得てください← https://nginxproxymanager.com/
こいつ自体は通常81番ポートを使用して通信するのですが、わざわざこのために81番ポートを外部に公開するのもわざわざ手打ちでポート番号を書くとか言うかっこ悪いことするのもいやなので、このNginxを前段の80/443ポートを使ったプロキシとして使い、すべてここから振り分けるやり方をしたいと思います。
で、これを含めて今回はサーバに導入するサービス全てをDockerで用意したいと思っていますので、こちらも併せて導入します。
Portainer
有名らしいんですが、今回初めて知りました。Dockerをまとめて管理できるDocker composeをさらにウェブからまとめて管理できるようにできるまとめのまとめみたいなやつです。
公式サイトはこちら← https://www.portainer.io/
こいつは9443のポートで通常待ち受けるんですが、今回は前段のnpmくんが矢面に立ってもらって、npm-Portainerコンテナ間をクローズドな通信をしてもらって表向きは80/443ポートで通信してる感じにしたい。
図はめんどいから作らないよ
図にすると面倒なんでやらんかもですが、WANからDockerで動いているnpmくんがhttps通信をする。そこから各サービスへと振り分けてもらいます。そのため、多くのシステムが固有のポート番号で動きたいっていう説明がありますが、そこにアクセスが可能なのはnpmくんだけです。セキュアだね。
で、それと同時にdocker compseで動かすのがPortainerっていうdocker compose管理ツール。
こいつだけでLANのDockerコンテナだけでなく、物理的に離れたサーバも管理できるらしい。便利。
WordPressとか、Wikiとか動かしたいものはたくさんあるんだけど、ホストOS(Ubuntu26)に直接インストールすると干渉しあった時とか管理と整理がクソだるいので、今回はこれを頑張ってみます。
おまじない
$ sudo apt update $ sudo apt upgrade -y $ sudo apt autoremove
ひとまず最新状態を再確認。
したらば二つを動かすdocker-compose.ymlを作成していくよ。
Geminiくん、吐きなさい。
だばぁして起動
docker-compose.yml
services:
# リバースプロキシ(正面玄関):外からはこれだけが見える状態にします
npm:
image: 'jc21/nginx-proxy-manager:latest'
container_name: nginx-proxy-manager
restart: always
ports:
- '80:80' # HTTP受付
- '443:443' # HTTPS受付
volumes:
- ./npm/data:/data
- ./npm/letsencrypt:/etc/letsencrypt
networks:
- secure_backend
# Portainer(管理画面):外部ポートは一切開放せず、完全に隠蔽します
portainer:
image: portainer/portainer-ce:latest
container_name: portainer
restart: always
# 💡 ports 属性をあえて定義しないことで、カゴヤVPSの外部(パブリックIP)からは直接触れなくなります。
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
networks:
- secure_backend
volumes:
portainer_data:
networks:
secure_backend:
name: secure_backend # 2つのコンテナが同居する専用のプライベートネットワーク
でこれを/home/ubuntu配下に展開用のフォルダを作成して起動させます。
mkdir -p server-base
cd server-base
sudo docker compose up -d
そしたらWindowsの場合はここでcmd……ではなくPowerShellを起動します。
そんで、手元のPCでUbuntuのlocalhostにアクセスできる的なサムシングを送信。
ssh -L 8181:127.0.0.1:81 Ubuntuのユーザー名@あなたのUbuntuサーバーのIPアドレス
これを送信すると、手元のPCのブラウザを開いてlocalhost:8181って入力してるのにそのlocalhostは手元じゃなくてUbuntuのことを指すらしい(都合いいな……)
まあでも、もしかしたらここでポート関連でうまく動かないかもしれないです(リセットされる感じになったわ)
そんな時はdocker-compose.ymlのnpm通信用にポート81番を制限付きで追記する。
ports:
- '80:80' # HTTP受付
- '443:443' # HTTPS受付
- '127.0.0.1:81:81' # 👈この行を追加してください!
volumes:
- ./npm/data:/data
これでUbuntuの81番ポートはUbuntu自身の通信からのみAllowされます。安心だね。
それが書けたらDockerを更新させて、再度localhostでアクセスできるようにサムシングを再送します。
$ sudo docker compose up -d
$ ssh -L 8181:127.0.0.1:81 Ubuntuのユーザー名@あなたのUbuntuサーバーのIPアドレス送信したらシェルはそのまま、ブラウザで再度ログインを試みます。
これで手元のブラウザはnginx-proxy-managerのログイン画面になったと思います。
初期設定画面なので自分が分かりやすいアドレスとパスを設定。
はいれました? そしたら次行きますね。
諸々の設定をしていきます
まずは今見えてるnpmくんに安全に入れるようにサブドメインをいっこ割り当てます。説明のためのサブドメインはhoge.example.comね。次に出てくるPortainerも専用のサブドメインfuga.example.comに設定したいので、DNSの設定をお忘れなく!
ちょっと不思議な感はあるけど、npm自身をリバースプロキシの配下に設定します。
まずは上部メニューの 「Hosts」 ➔ 「Proxy Hosts」 をクリック、モーダル右上の 「Add Proxy Host」 ボタンを押します。設定項目は下記の通り。
Domain Name: hoge.example.com
Scheme: http
ForwardHost / IP: nginx-proxy-manager #同じ docker-compose.yml 内にいるため、IPアドレスではなくこのアルファベット名で届きます
ForwardPort: 81
Block Common Exploits: ON #おまじない
SSLも新規作成して「SSLを強制する」に設定、HTSTとかHTTP/2とかもONにして決定ボタン。
問題が無ければSSLを10~20秒くらいかけて自動で取得してくれます。便利。ダッシュボード上でオンラインになってれば次の項目に行けますね。
ここでSSHでポンデリングしてたのを終了させて、純粋な気持ちでブラウザからhoge.example.comへアクセス。ちゃんと設定できてたらこの段階でhttps通信してるhogeくんとチュッチュできます。
そのあと、同じように下記の通り設定することで、Portainerにもログインできるようになります。
Domain Name: fuga.example.com
Scheme: https
ForwardHost / IP: portainer
ForwardPort: 9443
Block Common Exploits: ON #おまじない
SSLも同様に設定します。決定を押すといい感じに処理が走る走る。
……が、fugaくんは仕様で5分間処理が入らないと止まってしまうらしく、その場合はDockerを起動したディレクトリで再起動を試みる。
~/server-base $ sudo docker compose restart portnainer
再起動が終わったらさっさとログイン作業を終わらせるとサクッと中に入れます。
これでひとまずは作業完了。
GetStarted!を押すと、いま動かしてたdocker-conpose.ymlも管理対象にできます。
これからもセキュアであるために必要なこと
ポートは基本的に開けないこと(→Nginx-Proxy-Managerを経由させてサービスを展開する)
どうしても開けたい時は127.0.0.1:XXXXという感じにする。(よくわかってない)あと、同じネットワーク内でないといけないので、これからのサービスを起動させるときにはsecure_backendっていうネットワークを指定してあげないとダメ。
というわけで、これからガンガンに使い倒していく所存。よろしく、ね(ゆーとぴあ)
