ArgoCD SSO連携 SAML2.0編

技術本部 サービスリライアビリティグループ(SRG)の石川 雲(@kumo_rn5s)です。
#SRG(Service Reliability Group)は、主に弊社メディアサービスのインフラ周りを横断的にサポートしており、既存サービスの改善や新規立ち上げ、OSS貢献などを行っているグループです。
本記事は、ArgoCDの数少ないSAML2.0連携について、ArgoCDコミュニティ内のSAML連携現状と連携事例を紹介するものです。
 

ArgoCDのSSO連携について


ArgoCDは、Kubernetes環境向けの宣言型GitOps連携ツールです。弊社では、ArgoCDのGA前から導入し、複数のプロジェクトでArgoCDを利用しています。
ArgoCDのインストール後、初期設定に利用される全アクセス権を持つデフォルトユーザ が設定されます。この ユーザは、初期設定後は使用せず、代わりにローカルユーザへの切り替え、またはSSO統合の設定が推奨されています。
ArgoCDではSSOを設定するために、主に2つの方法があります。
  1. 組み込みDex Connector
    1. 現在のプロバイダがOIDCをサポートしていない場合 ( 例: )、またはDexの機能を活用したい場合(例: 属性マッピング)に適しています。DexもOIDCをサポートしています。
  1. 既存のOIDCプロバイダ
    1. Github、Auth0、Microsoft、Keycloak、Google、Oktaなど、既に使用しているOIDCプロバイダがある場合に適しています。

SAML2.0について

SAML(Security Assertion Markup Language)は、アイデンティティプロバイダ(IdP)とサービスプロバイダ(SP)間で認証及び承認データを交換するための規格として2001年に制定されました。2005年には、この規格のアップデート版であるSAML 2.0が承認され、ドメインを越えた認証と認可のためのアイデンティティ情報のやり取りを標準化されました。
この標準は、異なるドメイン間でのユーザ認証と権限付与を可能にすることを目的としています。当初の問題は、ユーザが複数のアプリケーションやサービスにアクセスする際、一貫性のある安全な認証方法が必要だったことです。
SAML仕様では、以下の用語が定義されています。
  • Subject: セキュリティ情報が交換されるエンティティ。通常は個人を指しますが、認証可能な任意のエンティティ(ソフトウェアプログラムを含む)を指すこともあります。ここで議論するユースケースでは、サブジェクトは一般にアプリケーションのユーザです。
  • SAML Assertion: サブジェクトに関するセキュリティ情報を含むXMLベースのメッセージ。
  • SAML Profile: ドメイン間SSOなどのビジネスユースケースにSAMLメッセージを使用する方法を定義するXMLファイルです。通常、X.509の証明書、IdPとSPの識別子、SPがAssertionを受け取るURL (ACS URL)、サポートされるBindingの種類などが含まれています。
  • Identity Provider(IdP): 認証されたSubjectに関するSAML Assertionを発行するサーバです。
  • Service Provider(SP): 認証をIdPに委任し、IdPによって発行される認証されたSubjectに関するSAML Assertionに依存します。
  • Trust Relationship: SPとIdP間の合意です。通常、X.509の証明書か認証前のMetadataの交換によって保たれます。
  • SAML Protocol Binding: SAMLメッセージ要素が標準通信プロトコル(例えばHTTP)にマッピングされ、SPとIdP間で伝送されます。実際には、SAML RequestおよびResponseメッセージは通常、HTTPS上でHTTP-RedirectまたはHTTP-POSTを使用して送信されます。
SAML 2.0では、最も一般的な認証方式はフローです。
また、 も存在しますが、認証の開始点が異なるだけです。
OIDCのCode Flow/Implicit Flowと比較すると、SAML 2.0はある程度シンプルであると言えますが、多くのシナリオでは、SAML単独ではなく、追加のレイヤーで認証と認可を拡張しているため、OIDCより設定や管理が複雑な場合が多いです。
ArgoCDとのSAML連携は フローに該当します。

ArgoCDとの連携には、どれがいい?

一般的に、既存のADやLDAPを持つ企業内環境では、多くのシステムがSAML 2.0のみに対応しているため、SAML 2.0が適しています。
しかし、ArgoCDでSAML 2.0の連携をサポートしているDex Connectorは、SAML 2.0自体を非推奨としています。内部ネットワーク外での使用では、SAML 2.0とArgoCDの連携はできるだけ避けるべきです。

SAML 2.0非推奨の原因

Dexの開発者 ericchiangDiscussionで述べたとおり、Dex ConnectorにおけるSAML 2.0の非推奨は主に三つの原因があります。
  1. Go言語のXMLパッケージの脆弱性
    1. Dexが依存するXMLライブラリ(Goの)は、XMLの処理において完全なRound-trip安定性を保証できないため、特定のXML構造が予期せぬ方法で解析される可能性があります。
  1. SAML Connectorの潜在的な脆弱性によってDexの構成が悪用されるリスク
    1. Dexが認証プロセスにおいて中心的なロールであるため、もしDexの認証がバイパスされれば、Dexを信頼する全てのリソースへのアクセスが可能になる可能性があります。また、SAMLは他のConnectorと比較して技術的に複雑であるため、この複雑さがさらなるセキュリティの課題を生じさせている可能性があります。つまりDex Connectorの今の開発体制だと、SAMLの仕様を完璧に対応できないと判断しているようです。
  1. SAML Connectorの開発者不足
これらの論点に対し、PHP開発者のcweagansはDexのSAMLサポート維持の重要性を強調していました。特にSAMLが唯一のオプションであるサービスのユーザにとって、DexがSAMLからOIDCへの移行の橋渡しとしても重要だと述べています。
“I fully agree that OIDC is the future and that SAML is broken and horrible, but Dex is currently serving a really important purpose as a stepping stone to help people get from SAML to OIDC while the rest of the world catches up.”
また、XMLパッケージの脆弱性に関しては、Go言語特有の問題ではなく、PHPコミュニティが過去にで類似の脆弱性に対処した経験を基に、の脆弱性も解決可能だと指摘しています。
Dexの構成が悪用されるリスクに対して、Dex Connectorを分割するという提案も出されました。非推奨化に向けては、さまざまな反対意見が寄せられているような状態です。

連携例

Dex SAML Connectorのサポート機能

DexのSAML Connectorサポートしている内容
  • ユーザ情報(ユーザ名、メール、グループなど)への属性値Mapping
  • SAML 2.0 HTTP POST Binding
  • Group Filter機能
サポートしていない内容
  • RefreshToken
  • SAML 2.0 HTTP Redirect Binding
  • AuthnRequestsの署名やMetaDataの暗号化
以下でKeycloakとOkta SAML IdPを利用する連携例を提供します。

Keycloak

  • オフにしている設定
    • Client signature required
    • Encrypt assertions
  • ACS URL設定
    • Groups設定
      • 基本的に、keycloakのGroup名はArgoCD Groupと同じ名前に設定しています。 それに対し、ArgoCD RBAC ConfigMapは以下のように設定する必要があります。もちろん、他の名前に使用し、属性マッピング設定でGroupsにマッピングすることも可能です。
    • 属性マッピング設定
      • 以下の二つをマッピングしています。
      • email
        • 設定時に、SAMLのOASISフォーマットの変更が必要です。例:
        • OASISフォーマットを変更したくない場合、Dex Connectorの を適切に使用すればそのまま利用できます。
      • group
        • マッパータイプから作成できます。
        • オプションは必ずオフにしてください。オンにすると、のようなGroup名になります。
    また、Keycloak Rolesを活用している組織なら、Dex Connectorの 設定を利用すれば、Role Listのマッパーと連携できます。
    全体のArgoCD ConfigMapは以下のようになります。この中で、はSAMLプロファイルにある証明書をbase64でエンコードしたものです。KeycloakのSAML Profileでは、証明書がXML形式になっているため、およびのへッダーとフッターを追加してSecretとして使用してください。

    Okta

    • ACS URL設定
      • 属性マッピング設定
        • Keycloakと同様に、ArgoCDのグループ名と同じものをOktaで設定しました。便宜上、全てのOktaグループをマッピングするように設定しましたが、実際には使用中のOkta組織ポリシーに従い、適切なフィルターに変更してください。
      全体のArgoCD ConfigMapは以下のようになります。

      おまけ

      ArgoCDのSSO連携のデバッグは難しいです。エラーログが分かりにくく、ドキュメントに不足がある場合があります。多くのIssueやDiscussionで指摘されているように、SSO連携をデバッグする際は、以下の順番で確認してみてください。
      • argocd-serverのエラーログを確認する
      • dex-serverのエラーログを確認する
      • もしdex側で「no session」という意味不明なエラーが出た場合は、の設定を見直してください。特にの欠如が原因でエラーが発生することが多いです。

      参考文献

      終わりに


      ArgoCDのSSO連携は、設定後はほとんど触ることがないものですが、設定自体の選択が重要です。残念ながら、SAML2.0の非推奨化に伴い、SAML2.0の使用をお勧めできない状況ですが、ArgoCDの人気とコミュニティの力で、いずれSAML2.0が再び活躍する時代が来るかもしれません。
       
      SRG では一緒に働く仲間を募集しています。 ご興味ありましたらぜひこちらからご連絡ください。
       
      SRG では最近出たホットなIT技術や書籍などについてワイワイ雑談するポッドキャストを運営しています。ぜひ、作業のお供に聞いていただければ幸いです。
      このエントリーをはてなブックマークに追加