SQL Server on Linux はADに参加させた端末からAD認証情報でログインできる機能があります。今回、Azure上に立てたAD DCとRHEL Serverで動作する環境が作れたのでその時の手順をまとめてみました。
まず、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
にしています。
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もインストールしておきます。
次に、AD DCにユーザーとDNSレコードを追加しておきます。
ユーザー: solrhel1@example.net
DNSレコード: sorhel1.example.net に対し、RHEL Serverに割り当てたprivate IPアドレス
ここから、ドキュメントに従ってAD認証をセットアップしていきます。
設定に使ったのは下記の値です。
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.