パスワードの付箋はもう不要:HomeLabにAuthentik SSOを導入する

HomeLab tutorial - IT technology blog
HomeLab tutorial - IT technology blog

「パスワード疲れ」の限界点

最初はPlexサーバーやシンプルなファイル共有から始まる、ごく自然な趣味のはずでした。しかし、私と同じようなタイプなら、その趣味はすぐに拡大していくことでしょう。半年もしないうちに、私のサーバーは15以上のコンテナの重みで悲鳴を上げていました。管理用のPortainer、メディア用のJellyfin、照明制御用のHome Assistant、プライベートWiki、そして3つの異なる開発用データベース。気づけば私は単なる愛好家ではなく、1日に何度も12種類ものパスワードを打ち込み続けるフルタイムのシステム管理者になっていたのです。

本当の危険は、単なる煩わしさだけではありません。セキュリティの欠如です。多くのセルフホストツールは簡易的なログインシステムしか備えておらず、多要素認証(MFA)が完全に欠落しているものもあります。これらをウェブに公開するのは、金庫に網戸を取り付けるようなものです。

今必要なのは、頑丈な「かんぬき」です。ここでシングルサインオン(SSO)とアイデンティティプロバイダー(IdP)が真価を発揮します。個別にログインする代わりに、デジタル資産全体へのアクセスを管理する中央の「門番」で一度だけ認証を行います。中央集中型のシステムへ移行することは、乱雑な趣味の延長と、プロフェッショナルな家庭内インフラを分ける決定的な境界線となります。

ゲートキーパーの選択:Authentik vs. Authelia

セルフホストのコミュニティでは、2つの有力な選択肢が議論を独占しています。どちらを選ぶかは、使用しているハードウェアと、テキストファイルの編集をどれだけ楽しめるかによって決まります。

  • Authelia: ミニマリスト向けの選択肢です。非常に軽量で、Raspberry Pi 4のような低電力ハードウェアでも完璧に動作します。ただし、専用の設定UIがないため、ほとんどの作業をYAMLファイル内で行う必要があります。
  • Authentik: 「オールインワン」の強力なツールです。洗練されたウェブインターフェース、内蔵のユーザーデータベース、そしてOAuth2、OIDC、SAMLといった最新プロトコルのネイティブサポートを備えています。その「Outpost(アウトポスト)」システムにより、リバースプロキシとの統合が驚くほどスムーズに行えます。

最近の多くのHomeLabには、Authentikをお勧めしています。ビジュアルダッシュボードのおかげで、ユーザー、グループ、権限が実際にどのように流れているかを把握するのが非常に簡単だからです。このガイドでは、Docker Composeを使用してAuthentikをデプロイします。

「ハンドシェイク」の仕組み

プロセスは、素早い3者間の対話です。あなたが stats.yourdomain.com にアクセスしようとすると、リバースプロキシ(Nginx Proxy ManagerやTraefik)があなたを止め、Authentikに「この人は有効なチケットを持っていますか?」と尋ねます。ログインしていない場合は、Authentikのポータルに飛ばされます。認証情報とTOTPコードを入力すると、Authentikはデジタルな「通行証」を渡し、あなたを元のアプリに戻します。

実践:Authentikのデプロイ

DockerとDocker Composeが準備されている必要があります。また、ドメイン名、またはサーバーの内部IPを指すローカルDNS設定(Pi-holeやAdGuard Homeなど)も必要です。

ステップ1:環境の準備

Authentikは高度なスタックです。コアサーバー、バックグラウンドワーカー、PostgreSQLデータベース、そしてキャッシュ用のRedisインスタンスが必要です。まずは専用のワークスペースを作成しましょう。

mkdir ~/authentik && cd ~/authentik

次に、一意のセキュリティキーを生成します。これを飛ばしてはいけません。デフォルトのキーを使用することは、トラブルを招くようなものです。Authentikでは、.env ファイルに素早く値を入力する方法が提供されています。

echo "PG_PASS=$(openssl rand -base64 36 | tr -d '\n')" >> .env
echo "AUTHENTIK_SECRET_KEY=$(openssl rand -base64 36 | tr -d '\n')" >> .env

ステップ2:Docker Composeの設定

docker-compose.yml を作成します。この設定は、実行に必要な基本サービスに焦点を当てて合理化されています。

version: '3.4'

services:
  postgresql:
    image: docker.io/library/postgres:15-alpine
    restart: unless-stopped
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"]
      start_period: 20s
      interval: 30s
      retry: 5
    volumes:
      - ./database:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: ${PG_PASS}
      POSTGRES_USER: ${PG_USER:-authentik}
      POSTGRES_DB: ${POSTGRES_DB:-authentik}
    env_file: [.env]

  redis:
    image: docker.io/library/redis:alpine
    command: --save 60 1 --loglevel warning
    restart: unless-stopped
    healthcheck:
      test: ["CMD-SHELL", "redis-cli ping | grep PONG"]
    volumes:
      - ./redis:/data

  server:
    image: ghcr.io/goauthentik/server:2024.8.3
    restart: unless-stopped
    command: server
    environment:
      AUTHENTIK_REDIS__HOST: redis
      AUTHENTIK_POSTGRESQL__HOST: postgresql
      AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik}
      AUTHENTIK_POSTGRESQL__NAME: ${POSTGRES_DB:-authentik}
      AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
    volumes:
      - ./media:/media
      - ./custom-templates:/templates
    env_file: [.env]
    ports:
      - "9000:9000"
      - "9443:9443"
    depends_on: [postgresql, redis]

  worker:
    image: ghcr.io/goauthentik/server:2024.8.3
    restart: unless-stopped
    command: worker
    user: root
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./media:/media
      - ./certs:/certs
    env_file: [.env]
    depends_on: [postgresql, redis]

docker-compose up -d でスタックを起動します。ログインを試みる前に、データベースが初期化されるまで60秒ほど待ちます。

ステップ3:初回実行時の設定

http://<your-server-ip>:9000/if/flow/initial-setup/ にアクセスします。この一度限りのURLで管理者アカウントを作成できます。ダッシュボードに入ると、メニュー項目の多さに圧倒されるかもしれませんが、最優先事項はセキュリティです。

Settings -> Flow and Stages -> Stages に移動し、すぐに TOTP Authenticator を設定してください。Authentikを Ente Auth や Bitwarden などのアプリと連携させることで、万が一マスターパスワードが漏洩しても、サーバーへのアクセスを防ぐことができます。

ステップ4:Forward Authで「認証機能のない」アプリを保護する

HomerやDashyのような優れたツールの多くには、認証機能が組み込まれていません。Authentikの「Forward Auth(フォワード認証)」を使えば、これらのアプリケーションの用心棒として機能させることができます。

  1. プロバイダーの作成: Applications -> Providers で「Proxy Provider」を作成します。アプリの内部URLを設定し、「Forward Auth (Single Application)」を選択します。
  2. アプリケーションの作成: Applications -> Applications で新しいエントリを作成し、先ほど作成したプロバイダーにリンクします。
  3. プロキシの更新: Nginx Proxy Managerを使用している場合は、ホスト設定の「Advanced」タブに以下のスニペットを貼り付けます:
# 検証のためのリダイレクト
auth_request /outpost.goauthentik.io/auth/nginx;
error_page 401 = @goauthentik_proxy_relogin;

location /outpost.goauthentik.io/ {
    proxy_pass http://<authentik-ip>:9000/outpost.goauthentik.io/;
    proxy_set_header Host $host;
}

location @goauthentik_proxy_relogin {
    return 302 $scheme://$host/outpost.goauthentik.io/start?rd=$request_uri;
}

さらに活用するために

基本をマスターしたら、OIDC (OpenID Connect) を調べてみてください。NextcloudやPortainerのようなプロフェッショナルグレードのアプリは、ネイティブでOIDCをサポートしています。アプリの前に「壁」を作るのではなく、OIDCによってアプリケーションがAuthentikと直接対話できるようになります。「Authentikでログイン」ボタンが表示され、すべてをシームレスに処理できるようになります。

また、ユーザーインターフェースをカスタマイズすることも可能です。サービスにカスタムのSVGアイコンをアップロードしたり、ログインポータルに独自の背景を設定したりできます。これにより、バラバラだったDockerコンテナの集まりが、統一感のあるブランド化されたプライベートクラウドへと変貌します。

最後に

認証の一元化は、HomeLabに対して行える最大級のアップグレードです。パスワード管理という日々のストレスから解放されると同時に、ジオブロッキングや詳細な監査ログといったエンタープライズ級のセキュリティ機能を手に入れることができます。設定には1時間ほどかかりますが、すべてのアプリが最新のMFAの壁に守られているという安心感は、その労力に見合う十分な価値があります。

Share: