銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

SQL Server on RHEL でAD認証をセットアップする

SQL Server on Linux はADに参加させた端末からAD認証情報でログインできる機能があります。今回、Azure上に立てたAD DCとRHEL Serverで動作する環境が作れたのでその時の手順をまとめてみました。

docs.microsoft.com

まず、AzureADではなく、AD DCサーバーを構築しているのはsetspnなどの操作が必要だからです。で、ADの構築ですがこんな感じになります。静的IPが割当たるようにNICを作っておいて、Windows Server 2016 datacentereditionを起動します。

$ az group create -n sollab1 -l japaneast

$ az network vnet create \
    --resource-group sollab1 \
    --name myVnet \
    --address-prefix 192.168.0.0/16 \
    --subnet-name mySubnet \
    --subnet-prefix 192.168.1.0/24

$ az network public-ip create -g sollab1 \
    -n pubip-myAzureDC1 \
    --dns-name tanaka733-addc1 \
    --allocation-method Static

$ az network nic create \
    --resource-group sollab1 \
    --name nic-myAzureDC1 \
    --vnet-name myVnet \
    --subnet mySubnet \
    --public-ip-address pubip-myAzureDC1 \
    --private-ip-address 192.168.1.4

$ az vm create --resource-group sollab1 \
    --name AzureDC1 \
    --image win2016datacenter \
    --admin-username clouduser \
    --admin-password P@ssword123 \
    --nics nic-myAzureDC1

起動したWindows ServerにAD DCをセットアップする手順はこちらのドキュメントを参考にしました。なお、今回ドメイン名はexample.netにしています。

gallery.technet.microsoft.com

DNSサーバーの設定まで完了したら、該当VNet(上の例だとmyVnet)のDNSサーバーをAzure defaultからAD DCサーバーの192.168.1.4に変更します。

次にSQL ServerをインストールするRHEL Server仮想マシンを作成します。今回はカスタムイメージ(VHDファイル)をアップロードしています。NICは上の手順と同様にして作成してください。

$ az vm create --resource-group sollab1 --name SORHEL1 --image '<uploaded_image_id>' --admin-username clouduser --admin-password P@ssword123  --nics nic-mysorhel1

起動後、FQDNでホスト名を割り当てておきます。

$ sudo hostnamectl set-hostname sorhel1.example.net

また、ドキュメントの手順に従ってSQL Serverもインストールしておきます。

docs.microsoft.com

次に、AD DCにユーザーとDNSレコードを追加しておきます。

ユーザー: solrhel1@example.net

DNSレコード: sorhel1.example.net に対し、RHEL Serverに割り当てたprivate IPアドレス

ここから、ドキュメントに従ってAD認証をセットアップしていきます。

docs.microsoft.com

設定に使ったのは下記の値です。

realm: EXAMPLE.NET

user: solrhel1@example.net

以下、いくつか途中で困ったコマンドの実行結果になります。

realm joinするときにパッケージが不足していると言われることがあるのでその場合は追加でインストールします。

# realm join EXAMPLE.NET -U 'solrhel1@example.net' -v
 * Resolving: _ldap._tcp.example.net
 * Performing LDAP DSE lookup on: 192.168.1.4
 * Successfully discovered: example.net
Password for solrhel1@example.net: 
 * Couldn't find file: /usr/sbin/sssd
 * Required files: /usr/sbin/oddjobd, /usr/libexec/oddjob/mkhomedir, /usr/sbin/sssd, /usr/bin/net
 * Resolving required packages
 ! PackageKit not available: The name org.freedesktop.PackageKit was not provided by any .service files
 ! Necessary packages are not installed: oddjob, oddjob-mkhomedir, sssd, samba-common-tools
realm: Couldn't join realm: Necessary packages are not installed: oddjob, oddjob-mkhomedir, sssd, samba-common-tools

# yum install oddjob oddjob-mkhomedir sssd samba-common-tools

完了するときはこう表示されます。

# sudo realm join EXAMPLE.NET -U 'solrhel1@example.net' -v
 * Resolving: _ldap._tcp.example.net
 * Performing LDAP DSE lookup on: 192.168.1.4
 * Successfully discovered: example.net
Password for solrhel1@example.net: 
 * Required files: /usr/sbin/oddjobd, /usr/libexec/oddjob/mkhomedir, /usr/sbin/sssd, /usr/bin/net
 * LANG=C LOGNAME=root /usr/bin/net -s /var/cache/realmd/realmd-smb-conf.0FZH7Y -U solrhel1@example.net ads join example.net
Enter solrhel1@example.net's password:DNS update failed: NT_STATUS_INVALID_PARAMETER

Using short domain name -- EXAMPLE
Joined 'SORHEL1' to dns domain 'example.net'
No DNS domain configured for sorhel1. Unable to perform DNS Update.
 * LANG=C LOGNAME=root /usr/bin/net -s /var/cache/realmd/realmd-smb-conf.0FZH7Y -U solrhel1@example.net ads keytab create
Enter solrhel1@example.net's password:
 * /usr/bin/systemctl enable sssd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/sssd.service to /usr/lib/systemd/system/sssd.service.
 * /usr/bin/systemctl restart sssd.service
 * /usr/bin/sh -c /usr/sbin/authconfig --update --enablesssd --enablesssdauth --enablemkhomedir --nostart && /usr/bin/systemctl enable oddjobd.service && /usr/bin/systemctl start oddjobd.service
 * Successfully enrolled machine in realm

# id solrhel1@example.net
uid=113001103(solrhel1@example.net) gid=113000513(domain users@example.net) groups=113000513(domain users@example.net)

ドキュメントにある通り、kinitコマンドで@の後ろは大文字で指定します。

# kinit solrhel1@EXAMPLE.NET
Password for solrhel1@EXAMPLE.NET: 

# klist 
Ticket cache: KEYRING:persistent:0:0
Default principal: solrhel1@EXAMPLE.NET

Valid starting       Expires              Service principal
10/12/2017 02:41:06  10/12/2017 12:41:06  krbtgt/EXAMPLE.NET@EXAMPLE.NET
    renew until 10/19/2017 02:41:03

AD DCサーバーでの作業はこんな感じになります。

PS > Import-Module ActiveDirectory
PS > New-ADUser mssql -AccountPassword (Read-Host -AsSecureString "Enter Password") -PasswordNeverExpi
res $true -Enabled $true
Enter Password: ********
PS > setspn -A MSSQLSvc/sorhel1.example.net:1433 mssql
Checking domain DC=example,DC=net

Registering ServicePrincipalNames for CN=mssql,CN=Users,DC=example,DC=net
        MSSQLSvc/sorhel1.example.net:1433
Updated object

kvnoコマンドはこんな感じ。

# kvno MSSQLSvc/sorhel1.example.net:1433
MSSQLSvc/sorhel1.example.net:1433@EXAMPLE.NET: kvno = 2

# ktutil
ktutil:   addent -password -p MSSQLSvc/sorhel1.example.net:1433@EXAMPLE.NET -k 2 -e aes256-cts-hmac-sha1-96
Password for MSSQLSvc/sorhel1.example.net:1433@EXAMPLE.NET: 
ktutil:  addent -password -p MSSQLSvc/sorhel1.example.net:1433@EXAMPLE.NET -k 2 -e rc4-hmac
Password for MSSQLSvc/sorhel1.example.net:1433@EXAMPLE.NET: 
ktutil:  wkt /var/opt/mssql/secrets/mssql.keytab
ktutil:  quit

で最後にSQL ServerにログインしたWindows認証ログインを作成して完了です。

# sqlcmd -S sorhel1.example.net -U SA

1> CREATE LOGIN [EXAMPLE\solrhel1] FROM WINDOWS;
2> go
1> SELECT name FROM sys.server_principals;
2> GO
name                                                                                                                            
--------------------------------------------------------------------------------------------------------------------------------
sa                                                                                                                              
public                                                                                                                          
sysadmin                                                                                                                        
securityadmin                                                                                                                   
serveradmin                                                                                                                     
setupadmin                                                                                                                      
processadmin                                                                                                                    
diskadmin                                                                                                                       
dbcreator                                                                                                                       
bulkadmin                                                                                                                       
##MS_SQLResourceSigningCertificate##                                                                                            
##MS_SQLReplicationSigningCertificate##                                                                                         
##MS_SQLAuthenticatorCertificate##                                                                                              
##MS_PolicySigningCertificate##                                                                                                 
##MS_SmoExtendedSigningCertificate##                                                                                            
##MS_PolicyEventProcessingLogin##                                                                                               
##MS_PolicyTsqlExecutionLogin##                                                                                                 
##MS_AgentSigningCertificate##                                                                                                  
BUILTIN\Administrators                                                                                                          
NT AUTHORITY\NETWORK SERVICE                                                                                                    
NT AUTHORITY\SYSTEM                                                                                                             
EXAMPLE\solrhel1                                                                                                                

(22 rows affected)

これで、ADユーザーとしてログインしたLinux端末上からSQL Serverにログインできるようになります。今回は、SQL Serverをインストールした同じホストに、suコマンドでユーザーを切り替えて試してみました。

# su sorhel1@example.net

$ sqlcmd -S sorhel1.example.net
1> 

注意事項としては、IPアドレスやADドメインではないpublicnなドメインでは認証できません。

$ sqlcmd -S 192.168.1.5
Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : SSPI Provider: Server not found in Kerberos database.
Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : Cannot generate SSPI context.