traefikのダッシュボードをbasic認証付きで使う

traefikinsecureなし・BASIC認証ありのダッシュボードを使う。

最後にymlファイルの関係個所全体を掲載。

使うオプション

insecuretrueにしないで、dashboardtrueにする。といってもデフォルトでtrueになっているようだ。しかし、明示しておいたほうがいい:

api:
  dashboard: true

これを静的設定に加える。

そしてルータルールで捕捉できるように動的設定を追加する、ための準備を行う。その準備がfile providerの設定。

動的設定はその後に行う。

file provider

file providerは、動的設定をymlファイルなどから定義できるようにするもの。ファイルの指定方法は2つあり:

  • filenameを使用して、ファイルパスを直に指定する
  • directoryを使用して、ファイルを含むディレクトリを指定する

のいずれかで指定できる。

dashboardのルータルールは動的設定で行うので、ymlファイルを作成してfile providerを設定して読み込むという流れが最適だと思われる。

そのfile providerの定義は静的設定にて:

providers:
  # 既存のproviderは省略
  file:
    directory: /etc/traefik/conf

と定義するだけ。/etc/traefik/confディレクトリのファイルを調べて動的設定として扱ってくれる。 必要ならファイルの変更を監視するためにwatch: trueを指定できる。そのほかの設定は公式ドキュメントにて: File - Traefik

file providerを定義出来たらあとはdashboardの動的設定を行えばいい。

dashboardの動的設定

公式ドキュメントのものをほぼそのまま定義した:

# Dynamic Configuration
http:
  routers:
    dashboard:
      rule: Host(`dashboard.example.com`)
      service: api@internal
      middlewares:
        - bAuth
      tls:
        certresolver: someresolver
  middlewares:
    bAuth:
      basicAuth:
        users:
          - "admin:$2y$05$bU/fW6ZqK8tZc87PQ4lspO1KT0X0Fea3akP06W7YnJ3xSMJw3olGy"

ruleで指定したパターン(自由)にマッチするリクエストがserviceで指定したapi@internal(固定)にルーティングされる。

一方で、誰にでもアクセス可能なのは困る。そのためbasic認証を行うようにする。ミドルウェアのbAuthを使用するようにして、bAuthでbasic認証の設定を行う。平文で送られるが、httpsの通信路なら安全なので、httpはhttpsにリダイレクトさせる。

basicAuthusersに記述するのは、basic認証のユーザ情報であり、これは、htpasswdを使って生成しろとドキュメントにあるので生成する。 ローカルのhtpasswdがある場合は特に問題なく生成できるが、もしない環境でかつdockerは使えるならば:

$ docker run --rm -it alpine sh -c 'apk -q update && apk -q --no-cache add apache2-utils && htpasswd -n -B admin'
New password: 
Re-type new password: 
admin:$2y$05$EXCvjKkhCdSuAqSX0yvya.zTHJxc.bOy7Pr1akBbu3OVtsOi.yHQS

などで、サクッと生成できる。ユーザ名adminhtpasswdのオプションは必要に応じて調整する。

また、basic認証を使うときはTLSを使うのでcertresolverを設定している。Let's encryptを使っていれば大体設定済みなので省略。以前書いたcertresolverの設定: リバースプロキシとしてnginx-proxyの代わりにtraefikを導入 | ikapblog

全体

以上のことを踏まえて必要なymlファイルは以下のようになる。

静的設定

まずは静的設定から:

# Static configuration
# /etc/traefik/traefik.yml

# 関連性が薄いものは省略

providers:
  # other providers...
  file:
    directory: /etc/traefik/conf

entrypoints:
  web:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: websecure
          scheme: https
  websecure:
    address: ":443"

certificatesresolvers:
  someresolver:
    acme:
      # 省略

api:
  dashboard: true

dashboardの動的設定

続いて、dashboardの動的設定:

# Dynamic Configuration
# /etc/traefik/conf/dashboard.yml
http:
  routers:
    dashboard:
      rule: Host(`dashboard.example.com`)
      service: api@internal
      middlewares:
        - bAuth
      tls:
        certresolver: someresolver
  middlewares:
    bAuth:
      basicAuth:
        users:
          - "admin:$2y$05$bU/fW6ZqK8tZc87PQ4lspO1KT0X0Fea3akP06W7YnJ3xSMJw3olGy"

おわり

わかれば簡単。file providerがあんまり分かってなかったが実際使ってみるとよくわかる。

コンテナが正しく認識されているかどうか調べたかったのでダッシュボードが使えて助かった。 前調べたときはinsecureしかなかったかと思っていたが、どうやら隅まで見ていなかったのかも知れない。

ホスト名をパターンマッチで使うときは、DNSの設定を忘れずに。

以上です。


広告

https://amzn.to/3iUFl0A
タイトルとURLをコピーしました