docker+gvisor上でkeycloakを動かす
gviosr上でdockerを使いセキュアな状態でkeycloakを運用してみよう。(目標)
gvisorはなにがいいのか?
ぐぐるとだいたい同じような情報があるけど、ちょっとセキュアにコンテナを使えるようになるよ。くらいでいいかも。
やったこと
- 準備/前提
- docker-ceを入れる
- gvisorを入れる
- git-hubのkeycloak dockerイメージを動かなかった
- dockerのdebianイメージにkeacloakいれて設定かえて動かしてみる
得た知見
- git-hubのjboss/keycloakだとgvisor上ではオプションでIPアドレスの変更などができないので無理
- gvisorのコンテナはexec -it bashみたいなので入れないのでちょっと困ると辛い
準備/前提
ダウンロードするものとかは~/gvisor/ディレクトリを使用する
~$ mkdir gvisor
~$ cd gvisor/
~/gvisor$
docker-ceインストール
dockerのコミュニティバージョンであるdocker-ceをインストールする。
パッケージをダウンロード
~/gvisor$ wget https://download.docker.com/linux/debian/dists/buster/pool/stable/amd64/docker-ce_18
.03.1~ce-0~debian_amd64.deb
パッケージをdpkgでインストール
~/gvisor$ sudo dpkg -i docker-ce_18.03.1~ce-0~debian_amd64.deb
動作チェック
~/gvisor$ sudo docker run hello-world
gvisorを入れる
gvisorのナイトリービルドをインストールする
ダウンロードとhash確認
~/gvisor$ wget https://storage.googleapis.com/gvisor/releases/nightly/latest/runsc
~/gvisor$ wget https://storage.googleapis.com/gvisor/releases/nightly/latest/runsc.sha512
~/gvisor$ sha512sum -c runsc.sha512
権限変更と配置
~/gvisor$ chmod +x runsc
~/gvisor$ sudo mv runsc /usr/local/bin
dockerの設定変更と反映
$ sudo sh -c 'cat <<EOF > /etc/docker/daemon.json
> {
> "runtimes": {
> "runsc": {
> "path": "/usr/local/bin/runsc"
> }
> }
> }
> EOF'
~/gvisor$ sudo systemctl restart docker
動作確認
~/gvisor$ sudo docker run --runtime=runsc hello-world
- git-hubのkeycloak dockerイメージを動かしてみる
$ sudo docker run -d -p 18080:8080 \
-e KEYCLOAK_USER=admin \
-e KEYCLOAK_PASSWORD=admin \
--name keycloak \
--runtime=runsc \
jboss/keycloak
Unable to find image 'jboss/keycloak:latest' locally
latest: Pulling from jboss/keycloak
469cfcc7a4b3: Pull complete
05677e4d61f0: Pull complete
a9520f492457: Pull complete
4d201219d6b1: Pull complete
1835cd4c1a3f: Pull complete
7714303c1354: Pull complete
0cb1390f3098: Pull complete
7a8e832639e4: Pull complete
35edde27ea33: Pull complete
d81d932b7a26: Pull complete
c0ca17cacfd1: Pull complete
7251b61e0d72: Pull complete
dbc3b0e37cdb: Pull complete
af694ff5dee0: Pull complete
527e34c6e8c1: Pull complete
57af359e5590: Pull complete
b772d54dd32d: Pull complete
12664afee115: Pull complete
Digest: sha256:a2d07439f3acc50c6ab2464a5b802c59d26c7e5cd4b354a763fdac877ed7e265
Status: Downloaded newer image for jboss/keycloak:latest
eda8ffa5d2fc5a446681efee2d9f4d81b3908926cace44ab409f6250cf663c29
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
おらんぞ?
落ちたっぽいのでログの確認
$ docker-logs keycloak
以下当該部分っぽいとこ
15:59:28,547 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-3) MSC000001: Failed to start service org.wildfly.network.interface.management: org.jboss.msc.service.StartException in service
org.wildfly.network.interface.management: WFLYSRV0082: failed to resolve interface management
at org.jboss.as.server.services.net.NetworkInterfaceService.start(NetworkInterfaceService.java:96) [wildfly-server-3.0.8.Final.jar:3.0.8.Final]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:2032) [jboss-msc-1.2.7.SP1.jar:1.2.7.SP1]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1955) [jboss-msc-1.2.7.SP1.jar:1.2.7.SP1]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [rt.jar:1.8.0_161]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [rt.jar:1.8.0_161]
at java.lang.Thread.run(Thread.java:748) [rt.jar:1.8.0_161]
IPが割りあてられてないような気がする。
いろいろ確認し辛いので1から入れてみる。
dockerのdebianイメージにkeacloakいれて設定かえて動かしてみる
docker+gvisorでDebian入れる
yasuo@kohei:~/gvisor$ sudo docker run --runtime=runsc -it debian /bin/bash
普通にkeycloakインストール
jdkインストール
root@ea30d21c1301:/# apt install openjdk-8-jdk
wgetもないのでインストール
root@ea30d21c1301:/# apt install wget
keycloakをダウンロード
root@ea30d21c1301:/# wget https://downloads.jboss.org/keycloak/4.1.0.Final/keycloak-4.1.0.Final.tar.gz
keycloakの解答
root@ea30d21c1301:/# tar xvfz keycloak-4.1.0.Final.tar.gz
keycloakの配置
root@ea30d21c1301:/# mv keycloak-4.1.0.Final /opt/keycloak
いざ起動
root@ea30d21c1301:/# cd /opt/keycloak/
root@ea30d21c1301:/opt/keycloak# ./bin/standalone.sh
やっぱエラーが出る
14:52:01,263 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-6) MSC000001: Failed to start
service org.wildfly.network.interface.management: org.jboss.msc.service.StartException in service
org.wildfly.network.interface.management: WFLYSRV0082: failed to resolve interface management
at org.jboss.as.server.services.net.NetworkInterfaceService.start(NetworkInterfaceService.j
ava:96) [wildfly-server-3.0.8.Final.jar:3.0.8.Final]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:2032) [jboss-msc-1.2.7.SP1.jar:1.2.7.SP1]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1955) [jboss-msc-1.2.7.SP1.jar:1.2.7.SP1]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [rt.jar:1.8.0_171]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [rt.jar:1.8.0_171]
at java.lang.Thread.run(Thread.java:748) [rt.jar:1.8.0_171]
ネットワークまわりっぽいのでデフォルトの127.0.0.1から実際に割りあてられてるアドレスに変更してみる。
NAMESを確認して、、、
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ea30d21c1301 debian "/bin/bash" 3 hours ago Up 9 minutes admiring_bardeen
IPアドレスを確認する
$ sudo docker inspect -format="{{ .NetworkSettings.IPAddress }}" admiring_bardeenormat=172.17.0.2
これをjboss.bind.address.managementの箇所に投入してみる
root@ea30d21c1301:/opt/keycloak/standalone/configuration# diff -u standalone.xml~ standalone.xml
--- standalone.xml~ 2018-07-12 16:52:50.134945210 +0000
+++ standalone.xml 2018-07-12 16:54:18.970861521 +0000
@@ -552,10 +552,10 @@
</profile>
<interfaces>
<interface name="management">
- <inet-address value="${jboss.bind.address.management:127.0.0.1}"/>
+ <inet-address value="${jboss.bind.address.management:172.17.0.2}"/>
</interface>
<interface name="public">
- <inet-address value="${jboss.bind.address:127.0.0.1}"/>
+ <inet-address value="${jboss.bind.address:172.17.0.2}"/>
</interface>
</interfaces>
<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
root@ea30d21c1301:/opt/keycloak# ./bin/standalone.sh
動いた。
ホストのブラウザから
http://172.17.0.2:8080/auth/
とかしたらとりあえずログイン画面は見えた。
気が向いたら続く
gvisorでテスト済みとされてるアプリケーションとかがどんなテストしたのか情報が欲しい。。。