🦔

Okta で Datadog へのアクセスを一元管理する

2023/12/11に公開

はじめに

Okta のシングルサインオンを用いて Datadog へのアクセスを一元管理するための方法についてです。

https://www.okta.com/jp/
https://www.datadoghq.com/ja/

目的

任意の Okta のグループに所属している人に対して、任意の Datadog のロールを割り当てる仕組みを実現する。

今回は Okta の SRE グループに所属している人に対して Datadog の SRE ロールをシングルサインオン経由で自動的に割り当てるまでの手順を解説します。

前提

Datadog, Okta 共に管理者権限を保有していることを前提としています。
Okta で事前に SRE グループを作成してあり、ユーザの割り当てが完了していることを前提としています。
Datadog は ap1 のサーバを利用しています。

手順

Datadog 側で SAML 設定を確認します

以下の画面より SAML の Configure 設定を有効化します。
https://ap1.datadoghq.com/organization-settings/login-methods

後の手順で Datadog Service Provider details を利用します。

Okta で SAML 用アプリケーションを作成します

Okta の管理画面から Applications / Applications から Create App Integration を選択します。

SAML 2.0 を選択します。

App name を入力し Next を選択します。

以下の設定を記入していきます。
Single sign-on URL に Datadog の SAML 設定の Assertion Consumer Service URL
Audience URI (SP Entity ID) に Datadog の SAML 設定の Service Provider Entity ID
Name ID format に EamilAddress
Attribute Statements には以下のドキュメントに沿って NameFormat / sn / givenName を設定します。

https://docs.datadoghq.com/ja/account_management/saml/okta/

また Okta のグループ情報を Datadog に連携するため Group Attribute Statements に memberOfUnspecified の形式で、 Filter を Matches regex の .* と設定します。
これにより Okta ユーザが所属しているすべてのグループの情報が SAML の認証情報として Datadog に連携されます。

画面下部の Preview the SAML Assertion を確認することで実際に利用される SAML の情報を確認することができます。
Okta のグループである SRE の情報も伝播されていることが確認できます。

<?xml version="1.0" encoding="UTF-8"?>
<saml2:Assertion ID="***" IssueInstant="2023-12-11T00:51:31.152Z" Version="2.0"
    xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">
    <saml2:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">http://www.okta.com/***</saml2:Issuer>
    <saml2:Subject>
        <saml2:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">***</saml2:NameID>
        <saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
            <saml2:SubjectConfirmationData NotOnOrAfter="2023-12-11T00:56:31.152Z" Recipient="***"/>
        </saml2:SubjectConfirmation>
    </saml2:Subject>
    <saml2:Conditions NotBefore="2023-12-11T00:46:31.152Z" NotOnOrAfter="2023-12-11T00:56:31.152Z">
        <saml2:AudienceRestriction>
            <saml2:Audience>https://ap1.datadoghq.com/account/saml/metadata.xml</saml2:Audience>
        </saml2:AudienceRestriction>
    </saml2:Conditions>
    <saml2:AuthnStatement AuthnInstant="2023-12-11T00:51:15.640Z" SessionIndex="***">
        <saml2:AuthnContext>
            <saml2:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml2:AuthnContextClassRef>
        </saml2:AuthnContext>
    </saml2:AuthnStatement>
    <saml2:AttributeStatement>
        <saml2:Attribute Name="NameFormat" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
            <saml2:AttributeValue
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">urn:oasis:names:tc:SAML:2.0:attrname-format:uri
            </saml2:AttributeValue>
        </saml2:Attribute>
        <saml2:Attribute Name="sn" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
            <saml2:AttributeValue
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">***
            </saml2:AttributeValue>
        </saml2:Attribute>
        <saml2:Attribute Name="givenName" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
            <saml2:AttributeValue
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">***
            </saml2:AttributeValue>
        </saml2:Attribute>
        <saml2:Attribute Name="memberOf" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified">
            <saml2:AttributeValue
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">Everyone
            </saml2:AttributeValue>
            <saml2:AttributeValue
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">SRE
            </saml2:AttributeValue>
        </saml2:Attribute>
    </saml2:AttributeStatement>
</saml2:Assertion>

Feedback は以下の設定を指定します。

以上の設定で Finish します。

作成したアプリケーションの詳細画面の Assignments より Assign to Groups で最初の手順で作成した SRE グループを紐付けます。

この段階で SRE グループのユーザはマイアプリにアプリケーションが表示されるようになります。

Datadog に Okta の設定を追加します

Okta で作成したアプリケーションの詳細画面の Sign On タブより Metadata details に記載してある Metadata URL をコピーします。

Metadata URL にアクセスした内容を .xml 形式のファイルで保存しておきます。

Datadog の SAML Configure からファイルをアップロードし Upload and Enable ボタンをクリックします。

Valid IdP metadata installed. と出てきたら成功です。

その後、 Additional Features にある Identity Provider (IdP) Initiated Login にチェックを付けます。

この状態で再度 Save Changes ボタンをクリックし、詳細画面に戻ってくると Datadog Service Provider details の Assertion Consumer Service URL の 2 行目に /id/xxxx suffix がついたアドレスが追加されています。
こちらのアドレスをコピーします。

Okta の設定を更新します

Okta のアプリケーション詳細画面に戻り General タブの SAML Settings を Edit します。

Configure SAML タブまで進み、 Single sign-on URL を先ほどコピーしたアドレスに変更します。

Datadog のアカウント自動発行を有効化します

このままの設定では新規ログインユーザは Datadog 側でも毎回ユーザを作成する必要があります。

ユーザが作成されていない場合は以下のようなエラー画面になります。

そこで新規ユーザがログインした際に自動で Datadog のユーザを作成する設定を追加します。

Datadog の SAML Configure の Additional Features の Just-in-Time Provisioning より自動でユーザを作成することを許可するドメインを追加します。

以下の設定の場合 tetsuya28.com ドメインのユーザがログインした際に自動的に Datadog Read Only Role 権限が付与されたユーザが作成されます。

Okta のグループと Datadog のロールを紐付けます

※ 同様の手順で Datadog で新規に実装された Teams へのマッピングも行うことができます。

以下のページより Okta の グループと Datadog のロールの紐付けを行います。
https://ap1.datadoghq.com/organization-settings/mappings/role-mappings

まずは Role Mappings の機能を有効化します。

その後、 New Mapping より Okta の Group Attribute Statements で指定した memberOf を Key として SRE グループをあらかじめ作成しておいた Datadog の SRE ロールと紐付けます。

動作確認

上記設定が完了すると Okta のアプリケーションダッシュボードより追加されたアプリケーションをクリックすることで Datadog に SAML 経由でアクセスすることができます。

Discussion