[アップデート] RDS for SQL ServerをセルフマネージドなActive Directoryドメインに参加させた場合においてKerberos認証がサポートされました

[アップデート] RDS for SQL ServerをセルフマネージドなActive Directoryドメインに参加させた場合においてKerberos認証がサポートされました

2025.08.21

しばたです。

タイトル通りですが、先日AWSよりRDS for SQL ServerをセルフマネージドなActive Directoryドメインに参加させた際にKerberos認証による接続がサポートされました。

AWSからのアナウンスはこちらになります。

https://aws.amazon.com/about-aws/whats-new/2025/08/amazon-rds-sql-server-kerberos-authentication-active-directory/

RDS for SQL ServerをセルフマネージドなActive Directoryドメインに参加させる機能自体は2年前にサポートされており、当時はKerberos認証による接続は非サポートでNTLM認証のみ可能でした。

https://dev.classmethod.jp/articles/rds-for-sqlserver-supports-self-managed-ad/

https://dev.classmethod.jp/articles/rds-for-sql-server-kerberos-authentication/

今回の更新によりセルフマネージドなActive Directoryドメインに参加させた場合でもKerberos認証による接続が可能となります。

更新内容の詳細

今回新たにKerberos認証をサポートするために設定面で

  1. セルフマネージドなActive Directory側の設定が一部変更
    • Kerberos認証に関わる追加の権限設定が必要に
  2. Kerberos認証用の専用のホスト名(CNAME)が自動登録される

の変更が入っています。

専用のホスト名は

  • <RDSインスタンス名>.<ハッシュ値>.リージョン名.awsrds.<ADドメインのFQDN>

の形でDNSにCNAMEレコードが登録され、このホスト名に対して接続するとKerberos認証が使われます。

その他制限事項について

認証方法以外の制限については記述が若干変わってますが従来通りの様です。

  • Your DB instances sync with AWS's NTP service and not the AD domain's time server. For database connections between linked SQL Server instances within your AD domain, you can only SQL authentication and not Windows authentication.
  • Group Policy Object settings from your self-managed AD domain are not be propagated to your RDS for SQL Server instances.

試してみた

ここからは実際に試していきます。

以前の記事と同等の環境を作りますが、今回は環境構築の手順が少し異なるので改めて紹介する形で進めます。

0. 構成図

以前とほぼ同じ構成です。

amazon-rds-sql-server-kerberos-authentication-active-directory-01

あらかじめ用意したVPC内にドメインコントローラーとなるWindows Server 2022 EC2を1台用意し、同じサブネットにRDS for SQL Server 2022 Standard Edtionの環境を作って試します。
今回はSQL Serverのバージョンを2019から2022に更新しています。

1. ドメインコントローラーの準備

ドメインコントローラーとなるEC2は本日時点最新の日本語版Windows Server 2022 AMIから作っています。

  • ami-0dd93ac55dfdc376a : Windows_Server-2022-Japanese-Full-Base-2025.08.13

EC2インスタンスの構築手順は割愛します。
また、セキュリティグループも前提条件に記載されたポートを解放する設定にしてあります。

Active Direcotryドメインの構築

セルフマネージドなActive Directoryドメインcorp.contoso.comを以下のPowerShellコマンドで構築しています。

PowerShell
# Windows機能の追加
Add-WindowsFeature AD-Domain-Services, GPMC, RSAT-ADDS, RSAT-AD-PowerShell, RSAT-DNS-Server | Format-List

# ドメイン作成+再起動
Import-Module ADDSDeployment
$params = @{
    DomainName        = 'corp.contoso.com';
    DomainNetbiosName = 'CORP';
    ForestMode        = 'WinThreshold';
    DomainMode        = 'WinThreshold';
    DatabasePath      = 'C:\Windows\NTDS';
    LogPath           = 'C:\Windows\NTDS';
    SysvolPath        = 'C:\Windows\SYSVOL';
    SafeModeAdministratorPassword = (ConvertTo-SecureString 'P@ssword' -AsPlainText -Force);
    InstallDns           = $true;
    CreateDnsDelegation  = $false;
    NoRebootOnCompletion = $false;
    Confirm = $false;
}
Install-ADDSForest @params

専用OU、専用ユーザーの作成

ドメインが出来上がった後、

  • RDSインスタンス専用のOU
  • RDSインスタンスをドメインに参加させるための専用ユーザー

を用意します。
AWSとして専用のOUと管理ユーザーを作ることが推奨されている点は変わりありません。

We recommend creating a dedicated OU and service credential scoped to that OU for any AWS account that owns an RDS for SQL Server DB instance joined your self-managed AD domain. By dedicating an OU and service credential, you can avoid conflicting permissions and follow the principal of least privilege.

今回も、

  • RDSInstances OU
  • rdssql@corp.contoso.com 管理ユーザー

を以下のPowerShellコマンドで作成します。

PowerShell
# RDSInstances という専用OUを用意
New-ADOrganizationalUnit -Name 'RDSInstances' -Path 'DC=corp,DC=contoso,DC=com'

# rdssql ユーザーを作成
$params = @{
    Name                 = 'rdssql';
    UserPrincipalName    = 'rdssql@corp.contoso.com';
    Description          = 'RDS for SQL Server service user';
    AccountPassword      = ConvertTo-SecureString -AsPlainText 'P@ssword' -Force;
    Enabled              = $true;
    PasswordNeverExpires = $true;
}
New-ADUser @params

amazon-rds-sql-server-kerberos-authentication-active-directory-02
専用OU

amazon-rds-sql-server-kerberos-authentication-active-directory-03
専用ユーザー

専用ユーザーの権限設定 (制御の委任)

続けてrdssql@corp.contoso.comユーザーに必要な権限を与えていきます。
ここが従来の方法と若干異なります。

はじめに「Active Directoryユーザーとコンピューター」を起動し、RDSInstancesOUを右クリックして「制御の委任」をクリックします。

amazon-rds-sql-server-kerberos-authentication-active-directory-04

ウィザードが開始されるので「次へ」をクリック。

amazon-rds-sql-server-kerberos-authentication-active-directory-05

選択されたユーザーとグループにrdssql@corp.contoso.comユーザーを追加して「次へ」をクリック。

amazon-rds-sql-server-kerberos-authentication-active-directory-06

委任するタスクは「委任するカスタムタスクを作成する」を選び「次へ」をクリック。

amazon-rds-sql-server-kerberos-authentication-active-directory-07

対象オブジェクトは下図の様に選び「次へ」をクリック。

amazon-rds-sql-server-kerberos-authentication-active-directory-08

  • 「フォルダー内の次のオブジェクトのみ」を選択
    *「コンピューターオブジェクト」にチェック
  • 「選択されたオブジェクトをこのフォルダーに作成する」にチェック
  • 「選択されたオブジェクトをこのフォルダーから削除する」にチェック

アクセス許可は下図の様に選び「次へ」をクリック。

amazon-rds-sql-server-kerberos-authentication-active-directory-09

  • 「全般」にチェック
    • アクセス許可欄の以下の項目にチェックを付ける
      • 「DNSホスト名への検証された書き込み」
      • 「サービスプリンシパル名への検証された書き込み」

amazon-rds-sql-server-kerberos-authentication-active-directory-10

  • NEW! : 「プロパティ固有」を追加でチェック
    • アクセス許可欄の以下の項目にチェックを付ける
      • 「servicePrincipalNameの書き込み」

最後に指定内容に間違いがないことを確認して「完了」をクリック。

amazon-rds-sql-server-kerberos-authentication-active-directory-11

次の Active Directory フォルダー内のオブジェクトの
制御を委任することを選択しました:

    corp.contoso.com/RDSInstances

制御を与えたグループ、ユーザー、または
コンピューター:

    rdssql (rdssql@corp.contoso.com)

次のアクセス許可が与えられています:

    DNS ホスト名への検証された書き込み
    サービス プリンシパル名への検証された書き込み
    servicePrincipalName の書き込み

次のオブジェクトの種類:

    コンピューター

これでrdssql@corp.contoso.comユーザーがRDSInstancesOUに対する所定の権限を持つことになります。

続けて「DNSマネージャー (dnsmgmt.msc)」を開き、サーバー欄を右クリックして「プロパティ」を選択します。

amazon-rds-sql-server-kerberos-authentication-active-directory-11-2

プロパティ欄の「セキュリティ」タブを選び、rdssql@corp.contoso.comユーザーに対する読み取り権限を追加します。

amazon-rds-sql-server-kerberos-authentication-active-directory-11-3

以上でドメインコントローラーの準備は完了です。

2. KMSの準備

次にKMSの準備を行います。
RDSサービスがKMS鍵のDecryptをする都合、独自のキーポリシーを持つカスタマー管理キーを新規に作成してやる必要があります。

ここは従来と変わらず、今回はrds-for-sql-server-self-managed-ad-2という名前のキーをCloudShellから作成しておきます。

CloudShell
# KMSキー作成 : rds-for-sql-server-self-managed-ad-2
#  * 対称キー
#  * 使用法は「暗号化および復号化」
#  * KMSオリジン
#  * シングルリージョンキー
kms_key_id=$(aws kms create-key --description 'Key for RDS for SQL Server with self managed AD' \
    --key-usage 'ENCRYPT_DECRYPT' \
    --origin 'AWS_KMS' \
    --no-multi-region \
    --query 'KeyMetadata.KeyId' \
    --output text)
echo $kms_key_id 
# エイリアスの割り当て
aws kms create-alias --alias-name 'alias/rds-for-sql-server-self-managed-ad-2' \
    --target-key-id $kms_key_id

# 権限の追加 : 環境に応じて要カスタマイズ
key_policy=$(cat << EOF
{
  "Version": "2012-10-17",
  "Id": "key-default-1",
  "Statement": [
    {
      "Sid": "Enable IAM User Permissions",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::$(aws sts get-caller-identity --query 'Account' --output text):root"
      },
      "Action": "kms:*",
      "Resource": "*"
    },
    {
        "Sid": "Allow use of the KMS key on behalf of RDS",
        "Effect": "Allow",
        "Principal": {
            "Service": [
                "rds.amazonaws.com"
            ]
        },
        "Action": "kms:Decrypt",
        "Resource": "*"
    }
  ]
}
EOF
)
aws kms put-key-policy --key-id $kms_key_id --policy "$key_policy"

amazon-rds-sql-server-kerberos-authentication-active-directory-12

amazon-rds-sql-server-kerberos-authentication-active-directory-13
キーポリシーは環境に応じて変えてください

3. Secrets Managerの準備

続けてSecrets Managerから新しいシークレットを作成します。
こちらも従来同様

  • CUSTOMER_MANAGED_ACTIVE_DIRECTORY_USERNAME : 専用ユーザーの名前(ここではrdssql@corp.contoso.com)
  • CUSTOMER_MANAGED_ACTIVE_DIRECTORY_PASSWORD : 専用ユーザーの平文パスワード

2つのキーを持ちRDSから複合可能にしてやればOKです。

今回はシークレット名rds-for-sql-server-self-managed-ad-2をCloudShellで作成してやります。

CloudShell
# RDS for SQL Server用のシークレットを作成
#  * KMSキーに前項で作成した鍵を指定
aws secretsmanager create-secret \
    --name "rds-for-sql-server-self-managed-ad-2" \
    --description "Secrets for RDS for SQL Server with self managed AD" \
    --secret-string "{\"CUSTOMER_MANAGED_ACTIVE_DIRECTORY_USERNAME\":\"rdssql@corp.contoso.com\",\"CUSTOMER_MANAGED_ACTIVE_DIRECTORY_PASSWORD\":\"P@ssword\"}" \
    --kms-key-id $kms_key_id

# 環境に応じてリソースポリシーはカスタマイズしてください
account_id=$(aws sts get-caller-identity --query 'Account' --output text)
resource_policy=$(cat << EOF
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "rds.amazonaws.com"
            },
            "Action": "secretsmanager:GetSecretValue",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:sourceAccount": "$account_id"
                },
                "ArnLike": {
                    "aws:sourceArn": "arn:aws:rds:ap-northeast-1:$account_id:db:*"
                }
            }
        }
    ]
}
EOF
)
aws secretsmanager put-resource-policy \
    --secret-id "rds-for-sql-server-self-managed-ad-2" \
    --resource-policy "$resource_policy" \
    --block-public-policy

最終的に下図の様になっていればOKです。

amazon-rds-sql-server-kerberos-authentication-active-directory-14

amazon-rds-sql-server-kerberos-authentication-active-directory-15

4. RDSインスタンスの作成

ここからRDSインスタンスを作成していきます。

本記事ではドメイン参加に必要な部分だけ記載します。
記載のない部分は環境に応じてよしなに設定してください。

今回はRDS for SQL Server 2022 Standard Editionで、エンジンバージョンは最新のSQL Server 2022 16.00.4205.1.v1を選んでいます。

amazon-rds-sql-server-kerberos-authentication-active-directory-16

Microsoft SQL Server Windows認証欄で「Microsoft SQL Server Windows認証を有効化」にチェックを付け、「セルフマネージド型のMicrosoft Active Directory」のオプションを選びます。
画面の表示が日本語化した以外に変更は無く、下記の通り記入します。

amazon-rds-sql-server-kerberos-authentication-active-directory-17

名称 用途 設定値
完全修飾ドメイン名 参加ドメイン FQDNで指定 (corp.contoso.com)
ドメイン組織単位 RDSインスタンス用OU名 識別名で指定 (OU=RDSInstances,DC=corp,DC=contoso,DC=com)
認証情報シークレットARN 認証情報シークレット ARNで指定 (rds-for-sql-server-self-managed-ad-2のARN)
プライマリDNS DNSサーバー IPアドレスを指定
セカンダリDNS DNSサーバー IPアドレスを指定(入力必須)

これでRDSインスタンスをエラー無く作成できればOKです。

amazon-rds-sql-server-kerberos-authentication-active-directory-18

ディレクトリステータスが「参加済み」になっていることを確認しておきます。

amazon-rds-sql-server-kerberos-authentication-active-directory-19

5. DNS設定の確認

設定に問題がなければRDSインスタンスの作成に合わせてKerberos認証専用のCNAMEレコードも設定されています。

amazon-rds-sql-server-kerberos-authentication-active-directory-20

今回の場合だとtestdb.xxxxxxxxxxxx.ap-northeast-1.awsrds.corp.contoso.comという別名になりました。

PowerShell
# nslookup コマンドでレコードを確認
PS C:\> nslookup testdb.xxxxxxxxxxxx.ap-northeast-1.awsrds.corp.contoso.com
サーバー:  localhost
Address:  ::1

名前:    EC2AMAZ-UD2HTRU.corp.contoso.com
Address:  10.0.21.20
Aliases:  testdb.xxxxxxxxxxxx.ap-northeast-1.awsrds.corp.contoso.com

SPNの登録状況を調べてみると次の通りでした。

PowerShell
# SQL Server (MSSQLSvc) 用SPNを検索
PS C:\> setspn -T * -F -Q MSSQLSvc/*
フォレスト DC=corp,DC=contoso,DC=com を確認しています
CN=EC2AMAZ-UD2HTRU,OU=RDSInstances,DC=corp,DC=contoso,DC=com
        MSSQLSvc/EC2AMAZ-UD2HTRU.corp.contoso.com:1433
        MSSQLSvc/EC2AMAZ-UD2HTRU.corp.contoso.com
        MSServerClusterMgmtAPI/EC2AMAZ-UD2HTRU
        MSServerClusterMgmtAPI/EC2AMAZ-UD2HTRU.corp.contoso.com
        TERMSRV/EC2AMAZ-UD2HTRU
        TERMSRV/EC2AMAZ-UD2HTRU.corp.contoso.com
        WSMAN/EC2AMAZ-UD2HTRU
        WSMAN/EC2AMAZ-UD2HTRU.corp.contoso.com
        RestrictedKrbHost/EC2AMAZ-UD2HTRU
        HOST/EC2AMAZ-UD2HTRU
        RestrictedKrbHost/EC2AMAZ-UD2HTRU.corp.contoso.com
        HOST/EC2AMAZ-UD2HTRU.corp.contoso.com

RDS for SQL Serverインスタンスの実体(EC2AMAZ-UD2HTRU)にSPNの登録がある点は変わりありません。
別名(awsrds.corp.contoso.comの方)に対するSPNも登録されているのかと思ったのですが、CNAMEの場合は実体となるホスト名だけSPNがあれば良い様です。

6. 接続確認

「ログイン」の設定を適切に行ったうえでSQLCMDからデフォルトのエンドポイントと今回新たに与えられた別名に対して接続し両者の認証方法を確認してみます。

PowerShell
# デフォルトのエンドポイントに対する接続 : NTLM認証
sqlcmd -S testdb.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -H "from ADDS (default endpoint)"
# 新しい別名に対する接続 : Kerberos認証
sqlcmd -S testdb.xxxxxxxxxxxx.ap-northeast-1.awsrds.corp.contoso.com -H "from ADDS (new CNAME)"

amazon-rds-sql-server-kerberos-authentication-active-directory-21

デフォルトエンドポイントに対する接続はNTLM認証、別名に対する接続はKerberos認証になるはずですが、実際にその通りになりました。

amazon-rds-sql-server-kerberos-authentication-active-directory-22

いい感じですね。

余談 : エラーに関して

最初に検証を行った際にDNSサーバーに対する権限設定を忘れていたため構築後エラーとなりました。

この様な場合RDSインスタンスの作成自体は完了するものの、RDSのイベントにエラーが記録される形になります。

RDS was unable to configure the Kerberos endpoint in your domain. This might prevent Kerberos authentication for your DB instance. Verify the network configuration between your DB instance and domain controllers.

amazon-rds-sql-server-kerberos-authentication-active-directory-23

RDSインスタンスの構築後はイベントの内容もチェックする様にしてください。
ちなみにDNSサーバーに対する権限設定を行うと割とすぐCNAMEレコードが作成されました。

上記の挙動から過去にセルフマネージドなActive Directoryドメインに参加させているRDSインスタンスにおいても権限周りのエラーが出ているものと予想されます。
AWSのドキュメントには既存環境に対する手当てについては記述が無かったのですが、おそらく管理ユーザー(今回だとrdssql@corp.contoso.com)に対する権限を更新してやるだけで大丈夫なはずです。

最後に

以上となります。

地味ですが役に立つ更新だと思うので機会があれば試してみると良いでしょう。

この記事をシェアする

facebookのロゴhatenaのロゴtwitterのロゴ

© Classmethod, Inc. All rights reserved.