FROM httpd:2.4.54
RUN sed -i \
-e 's!^#\(LoadModule authnz_ldap_module modules/mod_authnz_ldap.so\)!\1!' \
-e 's!^#\(LoadModule ldap_module modules/mod_ldap.so\)!\1!' \
-e 's!AllowOverride None!AllowOverride AuthConfig!' \
-e 's!LogLevel warn!LogLevel info!' \
conf/httpd.conf
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends ca-certificates libldap-common
ADD htdocs /usr/local/apache2/htdocs
1. Apache HTTP ServerでのBASIC認証
Dockerを利用し、Apache HTTP Serverを稼動します。まず、適当なディレクトリで次のような内容のDockerfileを準備します。
1.1. 参考情報
1.2. 作業用ディレクトリの確保
まず、作業用に適当な新規ディレクトリを作成して、cd でその中に移動しておきます。
1.3. Dockerfileの準備
エディタなどを利用した次のような内容の Dockerfile を作成してください。
続いて、このDockerfileファイルが存在するディレクトリで、次のようなコマンドを実行します。 まず設定(htdocs/.htaccess)とコンテンツ(htdocs/index.html)を準備します。
$ mkdir htdocs
続けて、catから最後のEOFで始まる行までコピーして実行してください。
1行目の*<<EOF* から 最後の EOF で囲まれた部分が、htdocs/.htaccess にコピーされます。
$ cat <<EOF > htdocs/.htaccess
AuthName "LDAP Authentication Gateway"
AuthType Basic
AuthBasicProvider ldap
AuthLDAPUrl "ldaps://opm00h.u-aizu.ac.jp/ou=people,ou=proxy,dc=u-aizu,dc=ac,dc=jp?uid"
<RequireAll>
Require valid-user
</RequireAll>
EOF
htdocs/index.htmlファイルも同様に、次のようなコマンドで作成します。
$ cat <<EOF > htdocs/index.html
<h1>Hello world!</h1>
EOF
ヒヤ・ドキュメント(<<EOF 〜 EOF)を使わなくても、emacsなどのエディタで、index.htmlを作成しても構いません。 また、index.html を追加で編集し、CSSファイルを追加するなど、htdocsディレクトリの内容は自由に変更して構いません。
最低限、次のようなファイルが存在しているはずです。
$ ls -al htdocs
次のように、.htaccessファイルと、index.htmlファイルが得られるはずです。
total 16
drwxr-xr-x 2 yasu-abe prof 4096 May 21 06:13 .
drwxr-xr-x 3 yasu-abe prof 4096 May 21 06:12 ..
-rw-r--r-- 1 yasu-abe prof 212 May 21 06:11 .htaccess
-rw-r--r-- 1 yasu-abe prof 22 May 21 06:13 index.html
1.4. Dockerイメージの作成
Dockerfileを変更した場合には、都度、docker buildコマンドを実行します。
$ docker build . --tag myhttpd
1.5. Dockerイメージの実行
Dockerfileのあるディレクトリで、次のようなコマンドを実行し、Dockerイメージを作成し、実行します。myhttpdの名称はシステムでユニークになるように指定してください。
$ docker run --rm --name myhttpd -p 8080:80 -v "`pwd`/htdocs:/usr/local/apache2/htdocs" -dit myhttpd
Webブラウザから http://localhost:8080/ にアクセスします。(OpenVPNを利用している場合には、"localhost"の部分は利用しているThinkPadのIPアドレスに置き換えてください。)
正常にDockerイメージが実行されていれば、Webブラウザでダイアログが表示され、ID, Passwordの入力が求められるので、AINS IDを入力します。作成した htdocs/index.html の内容が表示されれば成功です。
1.6. Dockerイメージの停止
先ほど`--name myhttpd
`のように名前を付けて実行している場合には、この名前を使用して停止させることができます。
(CONTAINER IDを指定しても停止させることができます。)
$ docker stop myhttpd
任意のイメージを停止する場合には、次のような手段が利用できます。
## 実行中のDockerイメージを確認する
$ docker ps
次のような出力が得られるはずです。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6f369e0210ec myhttpd "httpd-foreground" 56 seconds ago Up 54 seconds 0.0.0.0:8080->80/tcp myhttpd
...
先頭の"CONTAINER ID"か最後の"NAMES"に表示された名称を利用して、Dockerイメージを停止する
$ docker stop 6f369e0210ec
別解として、他のCONTAINER IDと重複しない程度に短縮して指定することもできます。
$ docker stop 6f3
どちらのdocker stopでも同じコンテナを停止することができます。
1.7. 設定のカスタマイズ
AINS-IDによる認証が発生するかどうかは、.htaccessファイルの内容によります。 htdocs/.htaccessファイルを他のサブディレクトリに移動すれば、誰でもアクセスできる部分と、認証したユーザーだけがアクセス可能となる場所が準備できます。
$ mkdir htdocs/secret
$ mv htdocs/.htaccess htdocs/secret/
$ cp htdocs/index.html htdocs/secret/
htdocs/secret/index.html は、パスワードが必要なページであることが一目で分かるように、言葉を変更しておくと良いかもしれません。
実行する前に、再度`docker build
`コマンドを実行します。
$ docker build . --tag myhttpd
続いて、更新したコンテナを実行します。
(既に起動しているコンテナがある場合には、`docker stop
myhttpd` で停止させてから実行してください。)
$ docker run --rm --name myhttpd -p 8080:80 -v "`pwd`/htdocs:/usr/local/apache2/htdocs" -dit myhttpd
-
認証なしにアクセスできるURL - http://localhost:8080/
-
認証が必要なURL - http://localhost:8080/secret/
※ OpenVPNを利用している場合等、リモートで実行する場合には、"localhost"の部分は、ThinkPadのIPアドレス(192.168.100.0/24)に置き換えて実行してください。
また、作業を終えた場合には、Dockerイメージを停止してください。
2. Harboarへの作成したイメージの登録(push)
今回はMakefileを利用せずに、手動でコマンドを実行します。
## 登録するイメージを $(DOCKER_IMAGE):$(DOCKER_IMAGE_VERSION) の名称で作成
$ docker build . --tag myhttpd:1.0 --no-cache
## 作成したイメージに、inovtst9.u-aizu.ac.jpで始まるTAGを追加
$ docker tag myhttpd:1.0 inovtst9.u-aizu.ac.jp/$(id -un)/myhttpd:1.0
## Harborにログインするための認証情報を付与
$ docker login inovtst9.u-aizu.ac.jp
## TAG名を利用して、Harbar(inovtst9.u-aizu.ac.jp)で登録
$ docker push inovtst9.u-aizu.ac.jp/$(id -un)/myhttpd:1.0
## 認証情報を~/.docker/configから削除
$ docker logout inovtst9.u-aizu.ac.jp
https://inovtst9.u-aizu.ac.jp/ にアクセスし、登録されているイメージを確認してください。
3. Kubernetesからの利用
次のような内容のファイルを作成します。 以下では作成したファイル名を、ldapauth.yaml として説明します。
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: ldapauth
labels:
app: ldapauth
spec:
replicas: 1
selector:
matchLabels:
app: ldapauth
template:
metadata:
labels:
app: ldapauth
spec:
containers:
- name: ldapauth
image: inovtst9.u-aizu.ac.jp/yasu-abe/myhttpd:1.0
---
apiVersion: v1
kind: Service
metadata:
name: ldapauth-service
labels:
app: ldapauth
spec:
type: ClusterIP
selector:
app: ldapauth
ports:
- port: 80
targetPort: 80
次のように作成したファイルをkubernetesに反映させます。
$ kubectl -n $(id -un) apply -f ldapauth.yaml
登録したldapauth-serviceの状況を確認し、Webブラウザからアクセスします。
$ kubectl -n $(id -un) get pod,svc -l app=ldapauth
次のようにpodとserviceの情報が表示されることを確認してください。
NAME READY STATUS RESTARTS AGE
pod/ldapauth-597bb5cc65-88dxt 1/1 Running 0 9s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/ldapauth-service ClusterIP 10.233.28.149 <none> 80/TCP 7m32s
このままではDockerのようにWebブラウザからアクセスすることがきないので、Proxyを設定します。
3.1. my-proxy経由でのWebブラウザからのアクセス
nginx-confを編集し、my-proxy podを再起動してから、Webブラウザでpodにアクセスします。
-
参考ページ: リバースプロキシー (Reverse Proxy)
nginx-confの編集は次のようなコマンドで実行します。
$ env EDITOR=emacs kubectl -n $(id -un) edit cm/nginx-conf
nginx-confではproxy_pass は次のように設定します。
proxy_pass http://ldapauth-service/;
編集が終ったら、保存してからエディタを終了します。
$ kubectl -n $(id -un) delete pod -l app=my-proxy
再起動が終ったら、自分のリストからアクセスできることを確認してください。
3.1.1. cm/nginx-conf の内容を初期化する方法
kubectl edit
などを編集してcm/nginx-confの内容がおかしくなった場合には、次の要領で初期化できます。
-
プロキシーサーバー (3.2 具体的な問題の例)
↑のリンク先に cm/nginx-conf を設定するコマンドラインが掲載されています。
次に、configmap-proxy-dvwa.yaml をダウンロードし、変更内容をemacs/vimなどのエディタで反映させてから、kubectl apply
コマンドで更新してください。
3.2. BASIC認証について
現在ではあまり使われないBASIC認証ですが、その理由は常にヘッダーに直接ID,Passwordの情報を記述するため、高頻度で情報がネットワーク上を流れるこから盗聴などの攻撃に弱いことにあります。
Firefox上でコンテキストメニューのInspectを選択し、Networkペインを開いてからページをリロードすると、Authorizationヘッダーの内容を確認することができます。
Authorizationヘッダーの内容は記号化されていますが、Base64が使われているだけなので、次のように簡単にデコードすることができます。
$ echo "akjdfIdsaj4e90dskja" | base64 -d
yasu-abe:sie90mcjd
3.3. Kubernetesに登録した情報の削除
ldapauth.yamlなどの設定ファイルがあればいつでもサービスを復活させることができるため、作業が終ったらKubernetesに登録した情報を削除することもできます。
$ kubectl -n $(id -un) delete -f ldapauth.yaml
登録の手続きにあったapplyをdeleteに変更しただけである点に注目してください。 復活させたい場合には、``apply -f ldapauth.yaml' のように、deleteの部分を、apply に変更してください。
YAMLファイルを保存しておけば、いつでもPodを削除したり、作成したりすることができます。