Traefikのダッシュボードを保護する

2022年10月7日

Traefikを使ってLet’s Encryptの証明書を得るの例では、Traefikのダッシュボードは、そのサーバの「IPアドレス:8080」で自由に誰でも見ることができた。サービスしているサイトや、そのサービスのためのTraefikのメカニズムが見えるだけで、何の操作もできないため、他のセキュリティが強固であれば、攻撃者にとっては意味がない情報だが、一般的にはサイトのリリース時には見えないようにせよと言われる。しかし、何らかの方法で保護し、リリース時にも有効にしたい。

SSLで保護する

まずは、SSLで保護する。もちろんこれだけでは、「誰でも自由に見れる」の部分は回避できない。接続が保護されるだけ。

    ports:
      - "80:80"
      - "443:443"
#      - "8080:8080" # 不要
    volumes:
      - "./letsencrypt:/letsencrypt"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
    labels: # 以下を追加
      - "traefik.enable=true"
      - "traefik.http.routers.traefik_https.rule=Host(`traefik.example.com`)"
      - "traefik.http.routers.traefik_https.entrypoints=websecure"
      - "traefik.http.routers.traefik_https.tls=true"
      - "traefik.http.routers.traefik_https.tls.certResolver=myresolver"
      - "traefik.http.routers.traefik_https.service=api@internal"

これだけで、https://traefik.example.comでのアクセスができるようになる。もはや8080のポート指定は不要になる。

80番ポートからのリダイレクトはしていないが、これで十分だろう。つまり、httpsではなく、http://traefik.example.comにアクセスすると「404 Page not found」表示になる。

BASIC認証の追加

BASIC認証を追加して、不特定多数に見られないようにする。

labelsにさらに以下を追加

      - "traefik.http.routers.traefik_https.middlewares=test-auth"
      - "traefik.http.middlewares.test-auth.basicauth.users=user:$$apr1$$d.yPkUve...................."

ユーザ名・パスワードのペアは以下で作成する。上の例は、まさにこのコマンドで作成したものだが、実行する都度、内容は変更される。

echo $(htpasswd -nb user password) | sed -e s/\\$/\\$\\$/g

良くウェブサイトで提供されている「BASIC認証用パスワードを作ります」的なサイトでは、何が違うのか全く動作しなかった。上のコマンドで生成する必要がある。