Traefikのダッシュボードを保護する
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認証用パスワードを作ります」的なサイトでは、何が違うのか全く動作しなかった。上のコマンドで生成する必要がある。