1. Apache HTTP ServerでのBASIC認証

Dockerを利用し、Apache HTTP Serverを稼動します。まず、適当なディレクトリで次のような内容のDockerfileを準備します。

1.2. 作業用ディレクトリの確保

まず、作業用に適当な新規ディレクトリを作成して、cd でその中に移動しておきます。

1.3. Dockerfileの準備

エディタなどを利用した次のような内容の Dockerfile を作成してください。

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

続いて、この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

※ 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にアクセスします。

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の内容がおかしくなった場合には、次の要領で初期化できます。

↑のリンク先に 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

登録の手続きにあったapplydeleteに変更しただけである点に注目してください。 復活させたい場合には、``apply -f ldapauth.yaml' のように、deleteの部分を、apply に変更してください。

YAMLファイルを保存しておけば、いつでもPodを削除したり、作成したりすることができます。