[Amazon FSx for NetApp ONTAP] CIFSサーバーのNetBIOS Aliasでファイルサーバーの切り替えをしようとしてみた

CIFSサーバーにNetBIOS Aliasを設定してもDNSのCNAMEレコードやSPNは設定されないので注意しよう
2023.02.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

CIFSサーバーにNetBIOS名のエイリアスを付与したいな

こんにちは、のんピ(@non____97)です。

皆さんはAmazon FSx for NetApp ONTAP(以降FSx for ONTAP)のCIFSサーバー(SMBサーバー)のNetBIOS名のエイリアスを設定したいなと思ったことはありますか? 私はあります。

ファイルサーバーの移行前後で同じUniversal Naming Convention(UNC)でアクセスできるようにしたいということがあると思います。

Amazon FSx for Windows File ServerではDNSエイリアスという機能があります。

これにより、FSx for Windows File Serverにアクセスするときの名前を複数指定することができます。この機能を活用することで、移行後も既存のファイルサーバーと同じUNCでアクセスすることが可能です。

FSx for ONTAPの場合、AWSマネジメントコンソール上から確認するとDNSエイリアスのような機能はないようでした。

ただし、NetApp公式ドキュメントを確認すると、CIFSサーバーにNetBIOS Aliasを設定できるようです。

NetBIOS エイリアスは、 SMB クライアントが SMB サーバに接続するときに使用できる SMB サーバの別名です。SMB サーバの NetBIOS エイリアスを設定すると、他のファイルサーバのデータを SMB サーバに統合して、 SMB サーバが元のファイルサーバの名前に応答するようにする場合に役立ちます。

SMB サーバの作成時または SMB サーバ作成後の任意の時点で、 NetBIOS エイリアスのリストを指定できます。リストへの NetBIOS エイリアスの追加や削除は、いつでも行うことができます。SMB サーバには NetBIOS エイリアスリスト内のどの名前を使用しても接続できます。

SMB サーバ用の NetBIOS エイリアスの概要を管理します

こちらの機能について調査してみたので紹介します。

いきなりまとめ

  • CIFSサーバーにNetBIOS Aliasを設定してもDNSのCNAMEレコードやSPNは設定されない
    • どちらも手動で設定する必要がある
    • NetBIOSではなくDNSで名前解決を行う環境の場合はNetBIOS Aliasを使ったファイルサーバーの切り替えはできない
  • SVMはデフォルトでLM、NTLM、NTLMv2、Kerberos認証をサポートしている
    • Kerberos認証のみ許可することも可能
    • ただしワークグループのCIFSサーバーはKerberos認証をサポートしていないので注意
  • SPNの設定不足などでKerberos認証ができない場合はNTLMv2で認証される
  • ファイルサーバーの移行前後で同じUNCでアクセスしたい場合はドメイン離脱・参加を活用する

DNSのCNAMEレコードを設定してアクセスできるか

検証環境

まず、CIFSサーバーのNetBIOS名について、DNSのCNAMEレコードを設定してSMBでアクセスできるかを確認してみます。

検証環境は以下の通りです。

CIFSサーバーのNetBIOS Aliasを試してみた検証環境構成図

SVMのCIFSサーバーのNetBIOS名について、DNSのCNAMEレコードを設定してSMBクライアントからSMBでアクセスできるか確認します。

AD DCについては以下記事の検証で使用したものを流用します。

使用するSVMは以下の通りです。

$ aws fsx describe-storage-virtual-machines --storage-virtual-machine-ids svm-00cef38f81500454f
{
    "StorageVirtualMachines": [
        {
            "ActiveDirectoryConfiguration": {
                "NetBiosName": "CIFS-SERVER",
                "SelfManagedActiveDirectoryConfiguration": {
                    "DomainName": "CORP.NON-97.NET",
                    "OrganizationalUnitDistinguishedName": "OU=FSxForONTAP,DC=corp,DC=non-97,DC=net",
                    "UserName": "FSxServiceAccount",
                    "DnsIps": [
                        "10.0.0.139"
                    ]
                }
            },
            "CreationTime": "2023-02-20T06:30:13.201000+00:00",
            "Endpoints": {
                "Iscsi": {
                    "DNSName": "iscsi.svm-00cef38f81500454f.fs-05f72eb8f8d03c709.fsx.us-east-1.amazonaws.com",
                    "IpAddresses": [
                        "10.0.8.21",
                        "10.0.8.192"
                    ]
                },
                "Management": {
                    "DNSName": "svm-00cef38f81500454f.fs-05f72eb8f8d03c709.fsx.us-east-1.amazonaws.com",
                    "IpAddresses": [
                        "10.0.8.29"
                    ]
                },
                "Nfs": {
                    "DNSName": "svm-00cef38f81500454f.fs-05f72eb8f8d03c709.fsx.us-east-1.amazonaws.com",
                    "IpAddresses": [
                        "10.0.8.29"
                    ]
                },
                "Smb": {
                    "DNSName": "CIFS-SERVER.CORP.NON-97.NET",
                    "IpAddresses": [
                        "10.0.8.29"
                    ]
                }
            },
            "FileSystemId": "fs-05f72eb8f8d03c709",
            "Lifecycle": "CREATED",
            "Name": "svm_1",
            "ResourceARN": "arn:aws:fsx:us-east-1:<AWSアカウントID>:storage-virtual-machine/fs-05f72eb8f8d03c709/svm-00cef38f81500454f",
            "StorageVirtualMachineId": "svm-00cef38f81500454f",
            "Subtype": "DEFAULT",
            "UUID": "122dacd1-b0e8-11ed-826e-c70dbf8a5f68"
        }
    ]
}

CIFSサーバーのコンピューターオブジェクトが作成されていることを確認します。

> Get-ADComputer -Filter "Name -eq 'CIFS-SERVER'" -SearchBase "DC=corp,DC=non-97,DC=net"


DistinguishedName : CN=CIFS-SERVER,OU=FSxForONTAP,DC=corp,DC=non-97,DC=net
DNSHostName       : CIFS-SERVER.CORP.NON-97.NET
Enabled           : True
Name              : CIFS-SERVER
ObjectClass       : computer
ObjectGUID        : 403216ab-1d39-4bf4-aefa-5796fa9c67ea
SamAccountName    : CIFS-SERVER$
SID               : S-1-5-21-38571244-2121234638-1230449559-1601
UserPrincipalName :

また、CIFSサーバーのAレコードが登録されていることを確認します。

> Get-DnsServerResourceRecord -Name "CIFS-SERVER" -ZoneName "corp.non-97.net"

HostName                  RecordType Type       Timestamp            TimeToLive      RecordData
--------                  ---------- ----       ---------            ----------      ----------
CIFS-SERVER               A          1          2/20/2023 6:00:00 AM 1.00:00:00      10.0.8.29

SPN(Service Principal Name)が存在していることを確認します。

> SetSPN /Q ("HOST/CIFS-SERVER.corp.non-97.net")
Checking domain DC=corp,DC=non-97,DC=net
CN=CIFS-SERVER,OU=FSxForONTAP,DC=corp,DC=non-97,DC=net
        HOST/cifs-server.corp.non-97.net
        HOST/CIFS-SERVER

Existing SPN found!

SPNはKerberos認証時に使用する一意な識別子です。

SPNの詳細は以下Microsoft公式ドキュメントをご覧ください。

DNSのCNAMEレコードを設定

CIFSサーバーのNetBIOS名について、DNSのCNAMEレコードを設定します。

今回はCIFS-ALIASというレコードにします。

# CNAMEレコードの追加
> Add-DnsServerResourceRecordCName -Name "CIFS-ALIAS" -HostNameAlias "CIFS-SERVER.corp.non-97.net" -ZoneName "corp.non-97.net"

# CNAMEレコードが追加されたことを確認
> Get-DnsServerResourceRecord -Name "CIFS-ALIAS" -ZoneName "corp.non-97.net"

HostName                  RecordType Type       Timestamp            TimeToLive      RecordData
--------                  ---------- ----       ---------            ----------      ----------
CIFS-ALIAS                CNAME      5          0                    01:00:00        CIFS-SERVER.corp.non-97.net.

名前解決できることも確認しておきます。

> nslookup CIFS-ALIAS.corp.non-97.net
Server:  localhost
Address:  ::1

Name:    CIFS-SERVER.corp.non-97.net
Address:  10.0.8.29
Aliases:  CIFS-ALIAS.corp.non-97.net

SPNは未登録の状態です。

> SetSPN /Q ("HOST/CIFS-ALIAS.corp.non-97.net")
Checking domain DC=corp,DC=non-97,DC=net

No such SPN found.

マウント確認

それでは、CIFS-ALIASのルートボリュームのファイル共有c$をSMBでマウントします。

> net use Z: \\CIFS-ALIAS.corp.non-97.net\c$
The command completed successfully.

> Get-PSDrive -PSProvider FileSystem

Name           Used (GB)     Free (GB) Provider      Root                                               CurrentLocation
----           ---------     --------- --------      ----                                               ---------------
C                  15.82         14.18 FileSystem    C:\                                       Users\Administrator.CORP
Z                   0.00          0.95 FileSystem    \\CIFS-SERVER.corp.non-97.net\c$

マウントできました。

SPNが未登録であるのでKerberos認証に失敗してマウントできないかと思っていましたが、どうやら違うようです。

ONTAP CLIからcifs session showでSMBのセッションを確認してみます。

::> cifs session show

Node:    FsxId05f72eb8f8d03c709-01
Vserver: svm_1
Connection Session                                        Open         Idle      Connection
ID         ID      Workstation      Windows User         Files         Time           Count
---------- ------- ---------------- ---------------- --------- ------------ ---------------
793449704  4304033868882640907                                        2m 7s               1
                   10.0.0.167       CORP\                    1
                                    Administrator

::> cifs session show -instance

Vserver: svm_1

                            Node: FsxId05f72eb8f8d03c709-01
                      Session ID: 4304033868882640907
                   Connection ID: 793449704
    Incoming Data LIF IP Address: 10.0.8.29
          Workstation IP Address: 10.0.0.167
        Authentication Mechanism: NTLMv2
           User Authenticated as: domain-user
                    Windows User: CORP\Administrator
                       UNIX User: root
                     Open Shares: 1
                      Open Files: 1
                      Open Other: 0
                  Connected Time: 2m 24s
                       Idle Time: 2m 14s
                Protocol Version: SMB3_1
          Continuously Available: No
               Is Session Signed: false
                    NetBIOS Name: -
           SMB Encryption Status: unencrypted
               Large MTU Enabled: true
                Connection Count: 1
                   Active Shares: c$

Kerberos認証ではなく、NTLMv2で認証していますね。

SVMはデフォルトではLM、NTLM、NTLMv2、Kerberos認証をサポートしています。

cifs security showで確認すると、確かにLM、NTLM、NTLMv2、Kerberos認証をサポートするlm-ntlm-ntlmv2-krbが指定されていました。

::> cifs security show -vserver svm_1

Vserver: svm_1

                            Kerberos Clock Skew:                   5 minutes
                            Kerberos Ticket Age:                  10 hours
                           Kerberos Renewal Age:                   7 days
                           Kerberos KDC Timeout:                   3 seconds
                            Is Signing Required:               false
                Is Password Complexity Required:                true
           Use start_tls for AD LDAP connection:               false
                      Is AES Encryption Enabled:               false
                         LM Compatibility Level:  lm-ntlm-ntlmv2-krb
                     Is SMB Encryption Required:               false
                        Client Session Security:                none
                SMB1 Enabled for DC Connections:               false
                SMB2 Enabled for DC Connections:      system-default
  LDAP Referral Enabled For AD LDAP connections:               false
               Use LDAPS for AD LDAP connection:               false
      Encryption is required for DC Connections:               false
   AES session key enabled for NetLogon channel:               false
    Try Channel Binding For AD LDAP Connections:                true

SPNが登録されていない場合はNTLMv2で認証しようとする様子をパケットキャプチャをして確認

SPNが登録されていない場合はNTLMv2で認証しようとする様子をSMBクライアントのWiresharkでパケットキャプチャをして確認します。

比較用にSPNが登録されているCIFS-SERVERでアクセスする時のパケットをキャプチャします。

SMBクライアントからCIFS-SERVERc$をYドライブにマウントします。

> net use Y: \\CIFS-SERVER.corp.non-97.net\c$
The command completed successfully.

> Get-PSDrive -PSProvider FileSystem

Name           Used (GB)     Free (GB) Provider      Root                                               CurrentLocation
----           ---------     --------- --------      ----                                               ---------------
C                  15.82         14.17 FileSystem    C:\                                       Users\Administrator.CORP
Y                   0.00          0.95 FileSystem    \\CIFS-SERVER.corp.non-97.net\c$
Z                   0.00          0.95 FileSystem    \\CIFS-ALIAS.corp.non-97.net\c$

ONTAP CLIからSMBのセッションを確認します。

::> vserver cifs session show

Node:    FsxId05f72eb8f8d03c709-01
Vserver: svm_1
Connection Session                                        Open         Idle      Connection
ID         ID      Workstation      Windows User         Files         Time           Count
---------- ------- ---------------- ---------------- --------- ------------ ---------------
793449704  4304033868882640907                                       9m 17s               1
                   10.0.0.167       CORP\                    1
                                    Administrator
793449705  4304033868882640908                                          25s               1
                   10.0.0.167       CORP\                    1
                                    Administrator
2 entries were displayed.


::> cifs session show -instance

Vserver: svm_1

                            Node: FsxId05f72eb8f8d03c709-01
                      Session ID: 4304033868882640907
                   Connection ID: 793449704
    Incoming Data LIF IP Address: 10.0.8.29
          Workstation IP Address: 10.0.0.167
        Authentication Mechanism: NTLMv2
           User Authenticated as: domain-user
                    Windows User: CORP\Administrator
                       UNIX User: root
                     Open Shares: 1
                      Open Files: 1
                      Open Other: 0
                  Connected Time: 19m 4s
                       Idle Time: 9m 31s
                Protocol Version: SMB3_1
          Continuously Available: No
               Is Session Signed: false
                    NetBIOS Name: -
           SMB Encryption Status: unencrypted
               Large MTU Enabled: true
                Connection Count: 1
                   Active Shares: c$

                            Node: FsxId05f72eb8f8d03c709-01
                      Session ID: 4304033868882640908
                   Connection ID: 793449705
    Incoming Data LIF IP Address: 10.0.8.29
          Workstation IP Address: 10.0.0.167
        Authentication Mechanism: Kerberos
           User Authenticated as: domain-user
                    Windows User: CORP\Administrator
                       UNIX User: root
                     Open Shares: 1
                      Open Files: 1
                      Open Other: 0
                  Connected Time: 49s
                       Idle Time: 39s
                Protocol Version: SMB3_1
          Continuously Available: No
               Is Session Signed: false
                    NetBIOS Name: -
           SMB Encryption Status: unencrypted
               Large MTU Enabled: true
                Connection Count: 1
                   Active Shares: c$

Kerberos認証を使っていることが分かりますね。

それでは、この時のパケットを確認します。

すると、SMBのセッションを開始する前に、Ticket Granting Ticket (TGT)による認証リクエスト(KRB_TGS_REQ)のレスポンスであるKRB_TGS_REPがあることが分かります。

TGS-REP

No.     Time           Source                Destination           Protocol Length Info
    255 6.319970       10.0.0.139            10.0.0.167            KRB5     379    TGS-REP

Frame 255: 379 bytes on wire (3032 bits), 379 bytes captured (3032 bits) on interface \Device\NPF_{C818DC1E-F323-46C4-88F3-EC4CF1BEE8DA}, id 0
Ethernet II, Src: 0a:9b:85:2b:e9:21 (0a:9b:85:2b:e9:21), Dst: 0a:9c:58:74:f7:c9 (0a:9c:58:74:f7:c9)
Internet Protocol Version 4, Src: 10.0.0.139, Dst: 10.0.0.167
Transmission Control Protocol, Src Port: 88, Dst Port: 64500, Seq: 1461, Ack: 1838, Len: 325
[2 Reassembled TCP Segments (1785 bytes): #254(1460), #255(325)]
Kerberos
    Record Mark: 1781 bytes
    tgs-rep
        pvno: 5
        msg-type: krb-tgs-rep (13)
        crealm: CORP.NON-97.NET
        cname
        ticket
        enc-part
  • 10.0.8.29 : SVMのIPアドレス
  • 10.0.0.139 : AD DCのIPアドレス
  • 10.0.0.167 : SMBクライアントのIPアドレス

Kerberos認証のメッセージの種類はRFC 4120の 7.5.7. Kerberos Message Typesをご覧ください。

それでは本題のSPNが登録されていないCIFS-ALIASでアクセスする時のパケットをキャプチャします。

SMBクライアントからCIFS-ALIASc$をZドライブに再マウントします。

> net use Z: /delete
Z: was deleted successfully.

> net use Z: \\CIFS-ALIAS.corp.non-97.net\c$
The command completed successfully.

> Get-PSDrive -PSProvider FileSystem

Name           Used (GB)     Free (GB) Provider      Root                                               CurrentLocation
----           ---------     --------- --------      ----                                               ---------------
C                  15.36         14.64 FileSystem    C:\                                       Users\Administrator.CORP
Y                   0.00          0.95 FileSystem    \\CIFS-SERVER.corp.non-97.net\c$
Z                   0.00          0.95 FileSystem    \\CIFS-ALIAS.corp.non-97.net\c$

ONTAP CLIからSMBのセッションを確認します。

::> cifs session show

Node:    FsxId05f72eb8f8d03c709-01
Vserver: svm_1
Connection Session                                        Open         Idle      Connection
ID         ID      Workstation      Windows User         Files         Time           Count
---------- ------- ---------------- ---------------- --------- ------------ ---------------
793449705  4304033868882640908                                       2m 54s               1
                   10.0.0.167       CORP\                    1
                                    Administrator
793449706  4304033868882640909                                       2m 54s               1
                   10.0.0.167       CORP\                    1
                                    Administrator
2 entries were displayed.


::> cifs session show -session-id 4304033868882640909 -instance

Vserver: svm_1

                            Node: FsxId05f72eb8f8d03c709-01
                      Session ID: 4304033868882640909
                   Connection ID: 793449706
    Incoming Data LIF IP Address: 10.0.8.29
          Workstation IP Address: 10.0.0.167
        Authentication Mechanism: NTLMv2
           User Authenticated as: domain-user
                    Windows User: CORP\Administrator
                       UNIX User: root
                     Open Shares: 1
                      Open Files: 1
                      Open Other: 0
                  Connected Time: 5m 10s
                       Idle Time: 3m 59s
                Protocol Version: SMB3_1
          Continuously Available: No
               Is Session Signed: false
                    NetBIOS Name: -
           SMB Encryption Status: unencrypted
               Large MTU Enabled: true
                Connection Count: 1
                   Active Shares: c$

NTLMv2認証ですね。

それでは、この時のパケットを確認します。

すると、SMBのセッションを開始する前に、Ticket Granting Ticket (TGT)による認証リクエスト(KRB_TGS_REQ)のレスポンスがKRB5KDC_ERR_S_PRINCIPAL_UNKNOWNでエラーになっていることが分かります。その後、NTLMSSP_NEGOTIATENTLMSSP_AUTHでセッションを張りに行っていることが分かります。

KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN

No.     Time           Source                Destination           Protocol Length Info
    101 3.460225       10.0.0.139            10.0.0.167            KRB5     169    KRB Error: KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN

Frame 101: 169 bytes on wire (1352 bits), 169 bytes captured (1352 bits) on interface \Device\NPF_{C818DC1E-F323-46C4-88F3-EC4CF1BEE8DA}, id 0
Ethernet II, Src: 0a:9b:85:2b:e9:21 (0a:9b:85:2b:e9:21), Dst: 0a:9c:58:74:f7:c9 (0a:9c:58:74:f7:c9)
Internet Protocol Version 4, Src: 10.0.0.139, Dst: 10.0.0.167
Transmission Control Protocol, Src Port: 88, Dst Port: 64881, Seq: 1, Ack: 1837, Len: 115
    Source Port: 88
    Destination Port: 64881
    [Stream index: 2]
    [Conversation completeness: Complete, WITH_DATA (63)]
    [TCP Segment Len: 115]
    Sequence Number: 1    (relative sequence number)
    Sequence Number (raw): 900478016
    [Next Sequence Number: 116    (relative sequence number)]
    Acknowledgment Number: 1837    (relative ack number)
    Acknowledgment number (raw): 788732745
    0101 .... = Header Length: 20 bytes (5)
    Flags: 0x018 (PSH, ACK)
    Window: 8195
    [Calculated window size: 2097920]
    [Window size scaling factor: 256]
    Checksum: 0x3224 [unverified]
    [Checksum Status: Unverified]
    Urgent Pointer: 0
    [Timestamps]
    [SEQ/ACK analysis]
    TCP payload (115 bytes)
    [PDU Size: 115]
Kerberos
    Record Mark: 111 bytes
    krb-error
        pvno: 5
        msg-type: krb-error (30)
        stime: Feb 21, 2023 04:20:03.000000000 Coordinated Universal Time
        susec: 660659
        error-code: eRR-S-PRINCIPAL-UNKNOWN (7)
        realm: CORP.NON-97.NET
        sname
            name-type: kRB5-NT-SRV-INST (2)
            sname-string: 2 items
                SNameString: cifs
                SNameString: CIFS-ALIAS.corp.non-97.net

(中略)

No.     Time           Source                Destination           Protocol Length Info
    105 3.460583       10.0.0.167            10.0.8.29             SMB2     220    Session Setup Request, NTLMSSP_NEGOTIATE

Frame 105: 220 bytes on wire (1760 bits), 220 bytes captured (1760 bits) on interface \Device\NPF_{C818DC1E-F323-46C4-88F3-EC4CF1BEE8DA}, id 0
Ethernet II, Src: 0a:9c:58:74:f7:c9 (0a:9c:58:74:f7:c9), Dst: 0a:cc:3c:d8:16:09 (0a:cc:3c:d8:16:09)
Internet Protocol Version 4, Src: 10.0.0.167, Dst: 10.0.8.29
Transmission Control Protocol, Src Port: 64880, Dst Port: 445, Seq: 386, Ack: 559, Len: 166
    Source Port: 64880
    Destination Port: 445
    [Stream index: 1]
    [Conversation completeness: Incomplete, DATA (15)]
    [TCP Segment Len: 166]
    Sequence Number: 386    (relative sequence number)
    Sequence Number (raw): 843739692
    [Next Sequence Number: 552    (relative sequence number)]
    Acknowledgment Number: 559    (relative ack number)
    Acknowledgment number (raw): 2956947069
    0101 .... = Header Length: 20 bytes (5)
    Flags: 0x018 (PSH, ACK)
    Window: 1024
    [Calculated window size: 262144]
    [Window size scaling factor: 256]
    Checksum: 0x1d84 [unverified]
    [Checksum Status: Unverified]
    Urgent Pointer: 0
    [Timestamps]
    [SEQ/ACK analysis]
    TCP payload (166 bytes)
NetBIOS Session Service
SMB2 (Server Message Block Protocol version 2)

No.     Time           Source                Destination           Protocol Length Info
    106 3.461355       10.0.8.29             10.0.0.167            SMB2     359    Session Setup Response, Error: STATUS_MORE_PROCESSING_REQUIRED, NTLMSSP_CHALLENGE

Frame 106: 359 bytes on wire (2872 bits), 359 bytes captured (2872 bits) on interface \Device\NPF_{C818DC1E-F323-46C4-88F3-EC4CF1BEE8DA}, id 0
Ethernet II, Src: 0a:cc:3c:d8:16:09 (0a:cc:3c:d8:16:09), Dst: 0a:9c:58:74:f7:c9 (0a:9c:58:74:f7:c9)
Internet Protocol Version 4, Src: 10.0.8.29, Dst: 10.0.0.167
Transmission Control Protocol, Src Port: 445, Dst Port: 64880, Seq: 559, Ack: 552, Len: 305
    Source Port: 445
    Destination Port: 64880
    [Stream index: 1]
    [Conversation completeness: Incomplete, DATA (15)]
    [TCP Segment Len: 305]
    Sequence Number: 559    (relative sequence number)
    Sequence Number (raw): 2956947069
    [Next Sequence Number: 864    (relative sequence number)]
    Acknowledgment Number: 552    (relative ack number)
    Acknowledgment number (raw): 843739858
    0101 .... = Header Length: 20 bytes (5)
    Flags: 0x018 (PSH, ACK)
    Window: 257
    [Calculated window size: 65792]
    [Window size scaling factor: 256]
    Checksum: 0x5176 [unverified]
    [Checksum Status: Unverified]
    Urgent Pointer: 0
    [Timestamps]
    [SEQ/ACK analysis]
    TCP payload (305 bytes)
NetBIOS Session Service
SMB2 (Server Message Block Protocol version 2)

No.     Time           Source                Destination           Protocol Length Info
    107 3.461786       10.0.0.167            10.0.8.29             SMB2     674    Session Setup Request, NTLMSSP_AUTH, User: CORP\Administrator

Frame 107: 674 bytes on wire (5392 bits), 674 bytes captured (5392 bits) on interface \Device\NPF_{C818DC1E-F323-46C4-88F3-EC4CF1BEE8DA}, id 0
Ethernet II, Src: 0a:9c:58:74:f7:c9 (0a:9c:58:74:f7:c9), Dst: 0a:cc:3c:d8:16:09 (0a:cc:3c:d8:16:09)
Internet Protocol Version 4, Src: 10.0.0.167, Dst: 10.0.8.29
Transmission Control Protocol, Src Port: 64880, Dst Port: 445, Seq: 552, Ack: 864, Len: 620
    Source Port: 64880
    Destination Port: 445
    [Stream index: 1]
    [Conversation completeness: Incomplete, DATA (15)]
    [TCP Segment Len: 620]
    Sequence Number: 552    (relative sequence number)
    Sequence Number (raw): 843739858
    [Next Sequence Number: 1172    (relative sequence number)]
    Acknowledgment Number: 864    (relative ack number)
    Acknowledgment number (raw): 2956947374
    0101 .... = Header Length: 20 bytes (5)
    Flags: 0x018 (PSH, ACK)
    Window: 1023
    [Calculated window size: 261888]
    [Window size scaling factor: 256]
    Checksum: 0x1f4a [unverified]
    [Checksum Status: Unverified]
    Urgent Pointer: 0
    [Timestamps]
    [SEQ/ACK analysis]
    TCP payload (620 bytes)
NetBIOS Session Service
SMB2 (Server Message Block Protocol version 2)

No.     Time           Source                Destination           Protocol Length Info
    108 3.488444       10.0.8.29             10.0.0.167            SMB2     145    Session Setup Response

Frame 108: 145 bytes on wire (1160 bits), 145 bytes captured (1160 bits) on interface \Device\NPF_{C818DC1E-F323-46C4-88F3-EC4CF1BEE8DA}, id 0
Ethernet II, Src: 0a:cc:3c:d8:16:09 (0a:cc:3c:d8:16:09), Dst: 0a:9c:58:74:f7:c9 (0a:9c:58:74:f7:c9)
Internet Protocol Version 4, Src: 10.0.8.29, Dst: 10.0.0.167
Transmission Control Protocol, Src Port: 445, Dst Port: 64880, Seq: 864, Ack: 1172, Len: 91
    Source Port: 445
    Destination Port: 64880
    [Stream index: 1]
    [Conversation completeness: Incomplete, DATA (15)]
    [TCP Segment Len: 91]
    Sequence Number: 864    (relative sequence number)
    Sequence Number (raw): 2956947374
    [Next Sequence Number: 955    (relative sequence number)]
    Acknowledgment Number: 1172    (relative ack number)
    Acknowledgment number (raw): 843740478
    0101 .... = Header Length: 20 bytes (5)
    Flags: 0x018 (PSH, ACK)
    Window: 257
    [Calculated window size: 65792]
    [Window size scaling factor: 256]
    Checksum: 0xa8f4 [unverified]
    [Checksum Status: Unverified]
    Urgent Pointer: 0
    [Timestamps]
    [SEQ/ACK analysis]
    TCP payload (91 bytes)
NetBIOS Session Service
SMB2 (Server Message Block Protocol version 2)

KRB5KDC_ERR_S_PRINCIPAL_UNKNOWNはSPNに誤りがある場合に発生するエラーです。

AD FS サービス アカウントの SPN に、構成の誤りや間違いがある場合は、問題が発生する可能性があります。 ネットワーク トレースを参照すると、KRB エラー: KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN のようなエラーが表示されていることがあります。

AD FS のトラブルシューティング - 統合 Windows 認証 | Microsoft Learn

以上の挙動から確かにKerberos認証に失敗すると、NTLMv2で認証しようとすることが分かりました。

そして、Kerberos認証をする際にはSPNが重要ということも理解できました。NetAppのKBにも解決策としてSPNを設定するような記載があります。

また、NTLMv2の認証の挙動は以下NetAppのKBとMicrosoft公式ドキュメントが参考になります。

SVMでKerberos認証のみ許可している場合の挙動の確認

ふと、SVMでKerberos認証のみ許可している場合の挙動が気になったので確認してみます。

ONTAP CLIでSVMでKerberos認証のみ許可します。

# Kerberos認証のみ許可
::> cifs security modify -vserver svm_1 -lm-compatibility-level krb

# Kerberos認証のみ許可されているか確認
::> cifs security show -vserver svm_1 -fields lm-compatibility-level
vserver lm-compatibility-level
------- ----------------------
svm_1   krb

# NTLMv2で認証したセッションが切れていないことを確認
::> cifs session show -session-id 4304033868882640909 -instance

Vserver: svm_1

                            Node: FsxId05f72eb8f8d03c709-01
                      Session ID: 4304033868882640909
                   Connection ID: 793449706
    Incoming Data LIF IP Address: 10.0.8.29
          Workstation IP Address: 10.0.0.167
        Authentication Mechanism: NTLMv2
           User Authenticated as: domain-user
                    Windows User: CORP\Administrator
                       UNIX User: root
                     Open Shares: 1
                      Open Files: 1
                      Open Other: 0
                  Connected Time: 24m 29s
                       Idle Time: 8m 2s
                Protocol Version: SMB3_1
          Continuously Available: No
               Is Session Signed: false
                    NetBIOS Name: -
           SMB Encryption Status: unencrypted
               Large MTU Enabled: true
                Connection Count: 1
                   Active Shares: c$

この状態でSMBクライアントからCIFS-ALIASc$をZドライブに再マウントします。

> net use Z: /delete
Z: was deleted successfully.

> net use Z: \\CIFS-ALIAS.corp.non-97.net\c$
Enter the user name for 'CIFS-ALIAS.corp.non-97.net': corp.non-97.net\Administrator
Enter the password for CIFS-ALIAS.corp.non-97.net:
System error 86 has occurred.

The specified network password is not correct.

認証を求められましたが、拒否されてしまいました。

NTLM認証は推奨されていません。

NTLM does not support any recent cryptographic methods, such as AES or SHA-256. It uses cyclic redundancy check (CRC) or message digest algorithms ([RFC1321]) for integrity, and it uses RC4 for encryption. Deriving a key from a password is as specified in [RFC1320] and [FIPS46-2]. Therefore, applications are generally advised not to use NTLM.

(以下機械翻訳)

NTLM は AES や SHA-256 といった最新の暗号化方式をサポートしていない。完全性については、巡回冗長検査(CRC)もしくはメッセージダイジェストのアルゴリズム([RFC1321])を用いており、暗号化については RC4 を用いている。パスワードからの鍵の導出は、[RFC1320]と[FIPS46-2]で規定されている通りである。このため、一般にアプリケーションでは NTLM を使用しないことが推奨される。

[MS-NLMP]: Security Considerations for Implementers | Microsoft Learn

Pass the Hash対策や通信を暗号化したい場合はKerberos認証以外は許可しないというのも良いと思います。ただしワークグループのCIFSサーバーはKerberos認証はサポートされていないので注意しましょう。

ワークグループモードの SMB サーバでは、 NTLM 認証のみがサポートされます。Kerberos 認証はサポートされません。

SMB サーバの最低限の認証セキュリティレベルを設定する

NetBIOS Aliasを試してみる

それでは、NetBIOS Aliasを試してみます。

自動でCNAMEレコードやSPNが登録されることを期待しています。

事前準備として登録していたCNAMEレコードを削除します。

# CNAMEレコードの削除
> Remove-DnsServerResourceRecord -Name "CIFS-ALIAS" -ZoneName "corp.non-97.net" -RRType "CNAME"

Confirm
Removing DNS resource record set by name CIFS-ALIAS of type CNAME from zone corp.non-97.net on EC2AMAZ-75JBQCK server.
Do you want to continue?
[Y] Yes  [N] No  [S] Suspend  [?] Help (default is "Y"): Y

# CNAMEレコードが削除されたことを確認
> Get-DnsServerResourceRecord -Name "CIFS-ALIAS" -ZoneName "corp.non-97.net"
Get-DnsServerResourceRecord : Failed to get CIFS-ALIAS record in corp.non-97.net zone on EC2AMAZ-75JBQCK server.
At line:1 char:1
+ Get-DnsServerResourceRecord -Name "CIFS-ALIAS" -ZoneName "corp.non-97.net" ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (CIFS-ALIAS:root/Microsoft/...rResourceRecord) [Get-DnsServerResourceRecord], CimException
    + FullyQualifiedErrorId : WIN32 9714,Get-DnsServerResourceRecord

以下NetApp公式ドキュメントに従ってONTAP CLIでNetBIOS AliasとしてCIFS-ALIASを追加します。

# NetBIOS Aliasが設定されていないことを確認
::> cifs show -vserver svm_1

                                          Vserver: svm_1
                         CIFS Server NetBIOS Name: CIFS-SERVER
                    NetBIOS Domain/Workgroup Name: CORP
                      Fully Qualified Domain Name: CORP.NON-97.NET
                              Organizational Unit: OU=FSxForONTAP,DC=corp,DC=non-97,DC=net
Default Site Used by LIFs Without Site Membership:
                                   Workgroup Name: -
                             Authentication Style: domain
                CIFS Server Administrative Status: up
                          CIFS Server Description:
                          List of NetBIOS Aliases: -

# NetBIOS Aliasとして CIFS-ALIAS を追加
::> cifs add-netbios-aliases -vserver svm_1 -netbios-aliases CIFS-ALIAS

# NetBIOS Aliasが設定されたことを確認
::> cifs show -vserver svm_1

                                          Vserver: svm_1
                         CIFS Server NetBIOS Name: CIFS-SERVER
                    NetBIOS Domain/Workgroup Name: CORP
                      Fully Qualified Domain Name: CORP.NON-97.NET
                              Organizational Unit: OU=FSxForONTAP,DC=corp,DC=non-97,DC=net
Default Site Used by LIFs Without Site Membership:
                                   Workgroup Name: -
                             Authentication Style: domain
                CIFS Server Administrative Status: up
                          CIFS Server Description:
                          List of NetBIOS Aliases: CIFS-ALIAS

NetBIOS Alias追加後にSPNを確認します。

> SetSPN /Q ("HOST/CIFS-ALIAS.corp.non-97.net")
Checking domain DC=corp,DC=non-97,DC=net

No such SPN found.

設定されていないですね。

CIFS-ALIASについて名前解決できるか確認します。

> nslookup CIFS-ALIAS
Server:  localhost
Address:  ::1

*** localhost can't find CIFS-ALIAS: Non-existent domain

# CIFS-ALIAS というDNSレコードがあるか確認
> Get-ADComputer -Filter "Name -eq 'CIFS-ALIAS'" -SearchBase "DC=corp,DC=non-97,DC=net"

名前解決できませんでした。

NetBIOS Aliasはもしかするとその名の通りNetBIOSで名前解決するときに使われる設定値かもしれませんね。今回はDNSで名前解決をしていないため設定したとしても何も効果がない可能性があります。

SPNとCNAMEレコードの登録してSMBでマウントできるか

DNSによる名前解決をしている場合はNetBIOS Aliasが効かなさそうということが分かりました。

FSx for Windows File ServerのDNSエイリアスの設定手順を参考にSPNとCNAMEレコードを登録して、SMBでマウントできるか確認します。

まず、SPNの登録です。

# SPNの登録
> $FSxDnsName = "CIFS-SERVER.corp.non-97.net"
> $Alias = "CIFS-ALIAS.corp.non-97.net"
> $FileSystemHost = (Resolve-DnsName $FSxDnsName | Where Type -eq 'A')[0].Name.Split(".")[0]
> $FSxAdComputer = (Get-AdComputer -Identity $FileSystemHost)

> Set-AdComputer -Identity $FSxAdComputer -Add @{"msDS-AdditionalDnsHostname"="$Alias"}

# SPNが登録されたことを確認
> SetSPN /Q ("HOST/CIFS-ALIAS.corp.non-97.net")
Checking domain DC=corp,DC=non-97,DC=net
CN=CIFS-SERVER,OU=FSxForONTAP,DC=corp,DC=non-97,DC=net
        HOST/CIFS-ALIAS.corp.non-97.net
        HOST/CIFS-ALIAS
        HOST/cifs-server.corp.non-97.net
        HOST/CIFS-SERVER

Existing SPN found!

SPNの登録が完了しました。次にCNAMEレコードの登録です。

# CNAMEレコードの追加
> Add-DnsServerResourceRecordCName -Name "CIFS-ALIAS" -HostNameAlias "CIFS-SERVER.corp.non-97.net" -ZoneName "corp.non-97.net"

# CNAMEレコードが追加されたことを確認
> Get-DnsServerResourceRecord -Name "CIFS-ALIAS" -ZoneName "corp.non-97.net"

HostName                  RecordType Type       Timestamp            TimeToLive      RecordData
--------                  ---------- ----       ---------            ----------      ----------
CIFS-ALIAS                CNAME      5          0                    01:00:00        CIFS-SERVER.corp.non-97.net.

# 名前解決できることを確認
> nslookup CIFS-ALIAS
Server:  localhost
Address:  ::1

Name:    CIFS-SERVER.corp.non-97.net
Address:  10.0.8.29
Aliases:  CIFS-ALIAS.corp.non-97.net

この状態でSMBクライアントからCIFS-ALIASc$をZドライブにマウントします。

> net use Z: \\CIFS-ALIAS.corp.non-97.net\c$
The command completed successfully.

> Get-PSDrive -PSProvider FileSystem

Name           Used (GB)     Free (GB) Provider      Root                                               CurrentLocation
----           ---------     --------- --------      ----                                               ---------------
C                  15.36         14.64 FileSystem    C:\                                       Users\Administrator.CORP
Y                   0.00          0.95 FileSystem    \\CIFS-SERVER.corp.non-97.net\c$
Z                   0.00          0.95 FileSystem    \\CIFS-ALIAS.corp.non-97.net\c$

エイリアスに対してマウントできましたね。

ONTAP CLIからSMBのセッションを確認します。

::> cifs session show

Node:    FsxId05f72eb8f8d03c709-01
Vserver: svm_1
Connection Session                                        Open         Idle      Connection
ID         ID      Workstation      Windows User         Files         Time           Count
---------- ------- ---------------- ---------------- --------- ------------ ---------------
793449705  4304033868882640908                                          40s               1
                   10.0.0.167       CORP\                    1
                                    Administrator
793449715  4304033868882640910                                          38s               1
                   10.0.0.167       CORP\                    1
                                    Administrator
2 entries were displayed.

::> cifs session show -session-id 4304033868882640910 -instance

Vserver: svm_1

                            Node: FsxId05f72eb8f8d03c709-01
                      Session ID: 4304033868882640910
                   Connection ID: 793449715
    Incoming Data LIF IP Address: 10.0.8.29
          Workstation IP Address: 10.0.0.167
        Authentication Mechanism: Kerberos
           User Authenticated as: domain-user
                    Windows User: CORP\Administrator
                       UNIX User: root
                     Open Shares: 1
                      Open Files: 1
                      Open Other: 0
                  Connected Time: 1m 6s
                       Idle Time: 55s
                Protocol Version: SMB3_1
          Continuously Available: No
               Is Session Signed: false
                    NetBIOS Name: -
           SMB Encryption Status: unencrypted
               Large MTU Enabled: true
                Connection Count: 1
                   Active Shares: c$

Kerberos認証で接続できていることが分かります。NetBIOS Name-となっていますね。やはりNetBIOSで名前解決したときでなければNetBIOS Aliasの効果は発揮されないのでしょうか。

NetBIOS Aliasを削除した状態でもエイリアスに対してSMBでマウントできるか

せっかくなのでNetBIOS Aliasを削除した状態でもエイリアスに対してSMBでマウントできるかも確認します。

ONTAP CLIでNetBIOS Aliasを削除します。

# NetBIOS Aliasを削除
::> cifs remove-netbios-aliases -vserver svm_1 -netbios-aliases -

Warning: This command will remove all NetBIOS aliases configured for the CIFS server.
Do you want to continue? {y|n}: y

# NetBIOS Aliasが設定されていないことを確認
::> cifs show -vserver svm_1 -fields netbios-aliases
vserver netbios-aliases
------- ---------------
svm_1   -

この状態でSMBクライアントからCIFS-ALIASc$をZドライブに再マウントします。

> net use Z: /delete
Z: was deleted successfully.

> net use Z: \\CIFS-ALIAS.corp.non-97.net\c$
The command completed successfully.

問題なくマウントできました。

ONTAP CLIからSMBのセッションを確認します。

::> cifs session show -session-id 4304033868882640911 -instance

Vserver: svm_1

                            Node: FsxId05f72eb8f8d03c709-01
                      Session ID: 4304033868882640911
                   Connection ID: 793449716
    Incoming Data LIF IP Address: 10.0.8.29
          Workstation IP Address: 10.0.0.167
        Authentication Mechanism: Kerberos
           User Authenticated as: domain-user
                    Windows User: CORP\Administrator
                       UNIX User: root
                     Open Shares: 1
                      Open Files: 1
                      Open Other: 0
                  Connected Time: 11m 25s
                       Idle Time: 44s
                Protocol Version: SMB3_1
          Continuously Available: No
               Is Session Signed: false
                    NetBIOS Name: -
           SMB Encryption Status: unencrypted
               Large MTU Enabled: true
                Connection Count: 1
                   Active Shares: c$

Kerberos認証で接続できていますね。

SVM間でNetBIOS名の引き継ぎ

検証環境

NetBIOS Aliasと全く関係ないですが、SVM間でNetBIOS名の引き継ぎできるかが気になったので確認してみます。

検証環境は以下の通りです。

SVM間でNetBIOS名の引き継ぎ検証環境構成図

NetBIOS名がCIFS-SERVER-2のSVM(svm_2)のNetBIOS名をCIFS-SERVERに変更できるか検証します。

大まかなステップは以下になります。

  • svm_1をドメインから離脱
  • svm_2をドメインから離脱
  • svm_2CIFS-SERVERとしてドメインに参加

本来のファイルサーバー移行であれば、新旧ファイルサーバー間でファイルの移行が必要になるので、どちらもドメインへの参加が必要だと考えます。そしてファイルが完全に同期が取れたタイミングで、どちらのファイルサーバーもドメインから離脱して新ファイルサーバーを旧ファイルサーバーのホスト名で再参加することになると考えます。

検証で使用するsvm_2は以下の通りです。

$ aws fsx describe-storage-virtual-machines --storage-virtual-machine-ids svm-0f9f29b94d409fbd0
{
    "StorageVirtualMachines": [
        {
            "ActiveDirectoryConfiguration": {
                "NetBiosName": "CIFS-SERVER-2",
                "SelfManagedActiveDirectoryConfiguration": {
                    "DomainName": "CORP.NON-97.NET",
                    "OrganizationalUnitDistinguishedName": "OU=FSxForONTAP,DC=corp,DC=non-97,DC=net",
                    "UserName": "FSxServiceAccount",
                    "DnsIps": [
                        "10.0.0.139"
                    ]
                }
            },
            "CreationTime": "2023-02-20T06:33:24.632000+00:00",
            "Endpoints": {
                "Iscsi": {
                    "DNSName": "iscsi.svm-0f9f29b94d409fbd0.fs-05f72eb8f8d03c709.fsx.us-east-1.amazonaws.com",
                    "IpAddresses": [
                        "10.0.8.35",
                        "10.0.8.127"
                    ]
                },
                "Management": {
                    "DNSName": "svm-0f9f29b94d409fbd0.fs-05f72eb8f8d03c709.fsx.us-east-1.amazonaws.com",
                    "IpAddresses": [
                        "10.0.8.67"
                    ]
                },
                "Nfs": {
                    "DNSName": "svm-0f9f29b94d409fbd0.fs-05f72eb8f8d03c709.fsx.us-east-1.amazonaws.com",
                    "IpAddresses": [
                        "10.0.8.67"
                    ]
                },
                "Smb": {
                    "DNSName": "CIFS-SERVER-2.CORP.NON-97.NET",
                    "IpAddresses": [
                        "10.0.8.67"
                    ]
                }
            },
            "FileSystemId": "fs-05f72eb8f8d03c709",
            "Lifecycle": "CREATED",
            "Name": "svm_2",
            "ResourceARN": "arn:aws:fsx:us-east-1:<AWSアカウントID>:storage-virtual-machine/fs-05f72eb8f8d03c709/svm-0f9f29b94d409fbd0",
            "StorageVirtualMachineId": "svm-0f9f29b94d409fbd0",
            "Subtype": "DEFAULT",
            "UUID": "8159c8f9-b0e8-11ed-826e-c70dbf8a5f68"
        }
    ]
}

svm_2のCIFSサーバーのコンピューターオブジェクトが作成されていることを確認します。

> Get-ADComputer -Filter "Name -eq 'CIFS-SERVER-2'" -SearchBase "DC=corp,DC=non-97,DC=net"


DistinguishedName : CN=CIFS-SERVER-2,OU=FSxForONTAP,DC=corp,DC=non-97,DC=net
DNSHostName       : CIFS-SERVER-2.CORP.NON-97.NET
Enabled           : True
Name              : CIFS-SERVER-2
ObjectClass       : computer
ObjectGUID        : 7cc76c76-81e3-4d98-8152-265a91eb9696
SamAccountName    : CIFS-SERVER-2$
SID               : S-1-5-21-38571244-2121234638-1230449559-1602
UserPrincipalName :

svm_2のCIFSサーバーのAレコードが登録されていることを確認します。

> Get-DnsServerResourceRecord -Name "CIFS-SERVER-2" -ZoneName "corp.non-97.net"

HostName                  RecordType Type       Timestamp            TimeToLive      RecordData
--------                  ---------- ----       ---------            ----------      ----------
CIFS-SERVER-2             A          1          2/20/2023 6:00:00 AM 1.00:00:00      10.0.8.67

CIFS-SERVER-2のSPNが存在していることを確認します。

> SetSPN /Q ("HOST/CIFS-SERVER-2.corp.non-97.net")
Checking domain DC=corp,DC=non-97,DC=net
CN=CIFS-SERVER-2,OU=FSxForONTAP,DC=corp,DC=non-97,DC=net
        HOST/cifs-server-2.corp.non-97.net
        HOST/CIFS-SERVER-2

Existing SPN found!

検証用ファイルの作成

CIFS-SERVERにアクセスしたときに、どちらのSVMなのか分かるように検証用のファイルを作成します。

# CIFS-SERVER-2 の c$ をXドライブにマウント
> net use X: \\CIFS-SERVER-2.corp.non-97.net\c$
The command completed successfully.

> Get-PSDrive -PSProvider FileSystem

Name           Used (GB)     Free (GB) Provider      Root                                               CurrentLocation
----           ---------     --------- --------      ----                                               ---------------
C                  15.34         14.66 FileSystem    C:\                                       Users\Administrator.CORP
X                   0.00          0.95 FileSystem    \\CIFS-SERVER-2.corp.non-97.net\c$
Y                   0.00          0.95 FileSystem    \\CIFS-SERVER.corp.non-97.net\c$
Z                   0.00          0.95 FileSystem    \\CIFS-ALIAS.corp.non-97.net\c$

# 各ファイル共有に検証用ファイルを追加
> echo "test" > Y:\test-svm_1.txt
> echo "test" > X:\test-svm_2.txt

各SVMのドメイン離脱

svm_1svm_2をドメインから離脱させます。

まずsvm_1をドメインから離脱させます。

# ドメインから離脱
::> cifs modify -vserver svm_1 -cifs-server CIFS-SERVER -workgroup WORKGROUP -status-admin down

Error: command failed: This operation is not supported because lm-compatibility-level is set to 'krb' only. Use the
       'vserver cifs security' command to modify the lm-compatibility-level.

# Kerberos認証以外も認証で使えるように変更
::> cifs security modify -vserver svm_1 -lm-compatibility-level lm-ntlm-ntlmv2-krb

# ドメインから離脱
:> cifs modify -vserver svm_1 -cifs-server CIFS-SERVER -workgroup WORKGROUP -status-admin down

Warning: To enter workgroup mode, all domain-based features must be disabled and their configuration removed
         automatically by the system, including continuously-available shares and shadow copies. However,
         domain-configured share ACLs such as "CORP.NON-97.NET\userName" will not work properly, but cannot be removed
         by Data ONTAP. Remove these share ACLs as soon as possible using external tools after the command completes.
Do you want to continue? {y|n}: y

Successfully queued CIFS Server Modify job [id: 835] for CIFS server "CIFS-SERVER". To view the status of the job, use
the "job show -id <jobid>" command.

# ドメインから離脱したことを確認
::> cifs show -vserver svm_1

                                          Vserver: svm_1
                         CIFS Server NetBIOS Name: CIFS-SERVER
                    NetBIOS Domain/Workgroup Name: WORKGROUP
                      Fully Qualified Domain Name: -
                              Organizational Unit: -
Default Site Used by LIFs Without Site Membership: -
                                   Workgroup Name: WORKGROUP
                             Authentication Style: workgroup
                CIFS Server Administrative Status: up
                          CIFS Server Description:
                          List of NetBIOS Aliases: -

事前にKerberos認証以外も認証できるようにする必要があるのがポイントですね。

同様にsvm_2をドメインから離脱させます。

# ドメインから離脱
::> cifs modify -vserver svm_2 -cifs-server CIFS-SERVER-2 -workgroup WORKGROUP -status-admin down

Warning: To enter workgroup mode, all domain-based features must be disabled and their configuration removed
         automatically by the system, including continuously-available shares and shadow copies. However,
         domain-configured share ACLs such as "CORP.NON-97.NET\userName" will not work properly, but cannot be removed
         by Data ONTAP. Remove these share ACLs as soon as possible using external tools after the command completes.
Do you want to continue? {y|n}: y

Successfully queued CIFS Server Modify job [id: 836] for CIFS server "CIFS-SERVER-2". To view the status of the job,
use the "job show -id <jobid>" command.

# ドメインから離脱したことを確認
::> cifs show -vserver svm_2

                                          Vserver: svm_2
                         CIFS Server NetBIOS Name: CIFS-SERVER-2
                    NetBIOS Domain/Workgroup Name: WORKGROUP
                      Fully Qualified Domain Name: -
                              Organizational Unit: -
Default Site Used by LIFs Without Site Membership: -
                                   Workgroup Name: WORKGROUP
                             Authentication Style: workgroup
                CIFS Server Administrative Status: up
                          CIFS Server Description:
                          List of NetBIOS Aliases: -

ドメイン離脱後、それぞれのコンピューターオブジェクト、Aレコード、SPNを確認します。

# コンピューターオブジェクトの確認
# CIFS-SERVER
> Get-ADComputer -Filter "Name -eq 'CIFS-SERVER'" -SearchBase "DC=corp,DC=non-97,DC=net"


DistinguishedName : CN=CIFS-SERVER,OU=FSxForONTAP,DC=corp,DC=non-97,DC=net
DNSHostName       : CIFS-SERVER.CORP.NON-97.NET
Enabled           : True
Name              : CIFS-SERVER
ObjectClass       : computer
ObjectGUID        : 403216ab-1d39-4bf4-aefa-5796fa9c67ea
SamAccountName    : CIFS-SERVER$
SID               : S-1-5-21-38571244-2121234638-1230449559-1601
UserPrincipalName :

# CIFS-SERVER-2
> Get-ADComputer -Filter "Name -eq 'CIFS-SERVER-2'" -SearchBase "DC=corp,DC=non-97,DC=net"


DistinguishedName : CN=CIFS-SERVER-2,OU=FSxForONTAP,DC=corp,DC=non-97,DC=net
DNSHostName       : CIFS-SERVER-2.CORP.NON-97.NET
Enabled           : True
Name              : CIFS-SERVER-2
ObjectClass       : computer
ObjectGUID        : 7cc76c76-81e3-4d98-8152-265a91eb9696
SamAccountName    : CIFS-SERVER-2$
SID               : S-1-5-21-38571244-2121234638-1230449559-1602
UserPrincipalName :

# Aレコードの確認
# CIFS-SERVER
> Get-DnsServerResourceRecord -Name "CIFS-SERVER" -ZoneName "corp.non-97.net"

HostName                  RecordType Type       Timestamp            TimeToLive      RecordData
--------                  ---------- ----       ---------            ----------      ----------
CIFS-SERVER               A          1          2/20/2023 6:00:00 AM 1.00:00:00      10.0.8.29

# CIFS-SERVER-2
> Get-DnsServerResourceRecord -Name "CIFS-SERVER-2" -ZoneName "corp.non-97.net"
Get-DnsServerResourceRecord : Failed to get CIFS-SERVER-2 record in corp.non-97.net zone on EC2AMAZ-75JBQCK server.
At line:1 char:1
+ Get-DnsServerResourceRecord -Name "CIFS-SERVER-2" -ZoneName "corp.non-97.net" ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (CIFS-SERVER-2:root/Microsoft/...rResourceRecord) [Get-DnsServerResourceRecord], CimException
    + FullyQualifiedErrorId : WIN32 9714,Get-DnsServerResourceRecord

# SPN
# CIFS-SERVER
> SetSPN /Q ("HOST/CIFS-SERVER.corp.non-97.net")
Checking domain DC=corp,DC=non-97,DC=net
CN=CIFS-SERVER,OU=FSxForONTAP,DC=corp,DC=non-97,DC=net
        HOST/CIFS-ALIAS.corp.non-97.net
        HOST/CIFS-ALIAS
        HOST/cifs-server.corp.non-97.net
        HOST/CIFS-SERVER

Existing SPN found!

# CIFS-SERVER-2
> SetSPN /Q ("HOST/CIFS-SERVER-2.corp.non-97.net")
Checking domain DC=corp,DC=non-97,DC=net
CN=CIFS-SERVER-2,OU=FSxForONTAP,DC=corp,DC=non-97,DC=net
        HOST/cifs-server-2.corp.non-97.net
        HOST/CIFS-SERVER-2

Existing SPN found!

ドメインから離脱したタイミングでCIFS-SERVER-2のAレコードが削除されていました。もしかするとCNAMEレコードから参照されているAレコードはドメインから離脱しても削除されないのかもしれないですね。

その他のリソースについては削除されていませんでした。

このタイミングで各ファイル共有にアクセスしてみます。

# CIFS-SERVER
> ls Y:\
ls : Cannot find path 'Y:\' because it does not exist.
At line:1 char:1
+ ls Y:\
+ ~~~~~~
    + CategoryInfo          : ObjectNotFound: (Y:\:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

# CIFS-SERVER-2
> ls X:\
ls : Cannot find path 'X:\' because it does not exist.
At line:1 char:1
+ ls X:\
+ ~~~~~~
    + CategoryInfo          : ObjectNotFound: (X:\:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

どちらもアクセスできませんでした。

svm_2のドメイン参加

svm_2CIFS-SERVERとしてドメイン参加させます。

ドメイン参加は以下記事を参考に行います。

# svm_2 を CIFS-SERVER としてドメイン参加
::> cifs modify -vserver svm_2 -cifs-server CIFS-SERVER -domain corp.non-97.net -ou OU=FSxForONTAP,DC=corp,DC=non-97,DC=net -status-admin down

In order to create an Active Directory machine account for the CIFS server, you must supply the name and password of a
Windows account with sufficient privileges to add computers to the "OU=FSxForONTAP,DC=corp,DC=non-97,DC=net" container
within the "CORP.NON-97.NET" domain.

Enter the user name: FSxServiceAccount

Enter the password:

Warning: An account by this name already exists in Active Directory at
         CN=CIFS-SERVER,OU=FSxForONTAP,DC=corp,DC=non-97,DC=net.
         If there is an existing DNS entry for the name CIFS-SERVER, it must be removed. Data ONTAP cannot remove such
         an entry.
         Use an external tool to remove it after this command completes.
         Ok to reuse this account? {y|n}: y

Successfully queued CIFS Server Modify job [id: 837] for CIFS server "CIFS-SERVER". To view the status of the job, use
the "job show -id <jobid>" command.

# ドメイン参加できたことを確認
::> cifs show -vserver svm_2

                                          Vserver: svm_2
                         CIFS Server NetBIOS Name: CIFS-SERVER
                    NetBIOS Domain/Workgroup Name: CORP
                      Fully Qualified Domain Name: CORP.NON-97.NET
                              Organizational Unit: OU=FSxForONTAP,DC=corp,DC=non-97,DC=net
Default Site Used by LIFs Without Site Membership:
                                   Workgroup Name: -
                             Authentication Style: domain
                CIFS Server Administrative Status: up
                          CIFS Server Description:
                          List of NetBIOS Aliases: -

ドメイン参加後、CIFS-SERVERCIFS-SERVER-2のコンピューターオブジェクト、Aレコード、SPNを確認します。

# コンピューターオブジェクトの確認
# CIFS-SERVER
> Get-ADComputer -Filter "Name -eq 'CIFS-SERVER'" -SearchBase "DC=corp,DC=non-97,DC=net"


DistinguishedName : CN=CIFS-SERVER,OU=FSxForONTAP,DC=corp,DC=non-97,DC=net
DNSHostName       : cifs-server.corp.non-97.net
Enabled           : True
Name              : CIFS-SERVER
ObjectClass       : computer
ObjectGUID        : 403216ab-1d39-4bf4-aefa-5796fa9c67ea
SamAccountName    : CIFS-SERVER$
SID               : S-1-5-21-38571244-2121234638-1230449559-1601
UserPrincipalName :

# CIFS-SERVER-2
> Get-ADComputer -Filter "Name -eq 'CIFS-SERVER-2'" -SearchBase "DC=corp,DC=non-97,DC=net"


DistinguishedName : CN=CIFS-SERVER-2,OU=FSxForONTAP,DC=corp,DC=non-97,DC=net
DNSHostName       : CIFS-SERVER-2.CORP.NON-97.NET
Enabled           : True
Name              : CIFS-SERVER-2
ObjectClass       : computer
ObjectGUID        : 7cc76c76-81e3-4d98-8152-265a91eb9696
SamAccountName    : CIFS-SERVER-2$
SID               : S-1-5-21-38571244-2121234638-1230449559-1602
UserPrincipalName :

# Aレコードの確認
# CIFS-SERVER
> Get-DnsServerResourceRecord -Name "CIFS-SERVER" -ZoneName "corp.non-97.net"

HostName                  RecordType Type       Timestamp            TimeToLive      RecordData
--------                  ---------- ----       ---------            ----------      ----------
CIFS-SERVER               A          1          2/21/2023 9:00:00 AM 1.00:00:00      10.0.8.67
CIFS-SERVER               A          1          2/20/2023 6:00:00 AM 1.00:00:00      10.0.8.29

# CIFS-SERVER-2
> Get-DnsServerResourceRecord -Name "CIFS-SERVER-2" -ZoneName "corp.non-97.net"
Get-DnsServerResourceRecord : Failed to get CIFS-SERVER-2 record in corp.non-97.net zone on EC2AMAZ-75JBQCK server.
At line:1 char:1
+ Get-DnsServerResourceRecord -Name "CIFS-SERVER-2" -ZoneName "corp.non-97.net" ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (CIFS-SERVER-2:root/Microsoft/...rResourceRecord) [Get-DnsServerResourceRecord], CimException
    + FullyQualifiedErrorId : WIN32 9714,Get-DnsServerResourceRecord

# SPN
# CIFS-SERVER
> SetSPN /Q ("HOST/CIFS-SERVER.corp.non-97.net")
Checking domain DC=corp,DC=non-97,DC=net
CN=CIFS-SERVER,OU=FSxForONTAP,DC=corp,DC=non-97,DC=net
        HOST/cifs-server.corp.non-97.net
        HOST/CIFS-SERVER

Existing SPN found!

# CIFS-SERVER-2
> SetSPN /Q ("HOST/CIFS-SERVER-2.corp.non-97.net")
Checking domain DC=corp,DC=non-97,DC=net
CN=CIFS-SERVER-2,OU=FSxForONTAP,DC=corp,DC=non-97,DC=net
        HOST/cifs-server-2.corp.non-97.net
        HOST/CIFS-SERVER-2

Existing SPN found!

CIFS-SERVERのAレコードとしてsvm_2のIPアドレスが追加されていますね。

また、CIFS-SERVERのSPNからHOST/CIFS-ALIAS.corp.non-97.netHOST/CIFS-ALIASが削除されていました。その他は変わりありませんでした。

アクセス確認

それではCIFS-SERVERにアクセスできるか確認します。

# CIFS-SERVER にアクセス
> ls Y:\
ls : Cannot find path 'Y:\' because it does not exist.
At line:1 char:1
+ ls Y:\
+ ~~~~~~
    + CategoryInfo          : ObjectNotFound: (Y:\:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

# CIFS-SERVER への接続を解除
> net use Y: /delete
Y: was deleted successfully.

# CIFS-SERVER に再接続
> net use Y: \\CIFS-SERVER.corp.non-97.net\c$
(待てども接続できず)

CIFS-SERVERに接続できませんでした。

原因はAレコードにsvm_1svm_2の2つのIPアドレスが付与されているためです。svm_1のIPアドレスのAレコードを削除して、再接続してみます。

# CIFS-SERVER を名前解決
> nslookup CIFS-SERVER.corp.non-97.net
Server:  ip-10-0-0-139.ec2.internal
Address:  10.0.0.139

Name:    CIFS-SERVER.corp.non-97.net
Addresses:  10.0.8.67
          10.0.8.29

# svm_1 のIPアドレスについてのAレコードを削除
> Remove-DnsServerResourceRecord -ZoneName "corp.non-97.net" -RRType "A" -Name "CIFS-SERVER" -RecordData "10.0.8.29"

Confirm
Removing DNS resource record CIFS-SERVER of type A from zone corp.non-97.net on EC2AMAZ-75JBQCK server. Do you want to
continue?
[Y] Yes  [N] No  [S] Suspend  [?] Help (default is "Y"): Y

# Aレコードが1つになっていることを確認
> Get-DnsServerResourceRecord -Name "CIFS-SERVER" -ZoneName "corp.non-97.net"

HostName                  RecordType Type       Timestamp            TimeToLive      RecordData
--------                  ---------- ----       ---------            ----------      ----------
CIFS-SERVER               A          1          2/21/2023 9:00:00 AM 1.00:00:00      10.0.8.67

# 名前解決の回答が1つになっていることを確認
> nslookup CIFS-SERVER.corp.non-97.net
Server:  ip-10-0-0-139.ec2.internal
Address:  10.0.0.139

Name:    CIFS-SERVER.corp.non-97.net
Address:  10.0.8.67

# DNSのキャッシュを削除
> ipconfig /flushdns

Windows IP Configuration

Successfully flushed the DNS Resolver Cache.

# CIFS-SERVER の c$ をYドライブにマウント
> net use Y: \\CIFS-SERVER.corp.non-97.net\c$
The command completed successfully.

# Yドライブにアクセス
> ls Y:\


    Directory: Y:\


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         2/21/2023   8:42 AM             14 test-svm_2.txt

アクセスできるようになりました。test-svm_2.txtであることから確かにsvm_2にアクセスしていることが分かります。

CIFSサーバーにNetBIOS Aliasを設定してもDNSのCNAMEレコードやSPNは設定されないので注意しよう

Amazon FSx for NetApp ONTAPのCIFSサーバーのNetBIOS Aliasを試してみました。

結果としては、CIFSサーバーにNetBIOS Aliasを設定してもDNSのCNAMEレコードやSPNは設定されないことが分かりました。

SPNの設定はついつい忘れがちなので注意が必要ですね。SPNの設定をしていなくても接続できるのはNTLM認証となっていると思います。意図したNTLM認証なのか意識しましょう。

ファイルサーバー移行を行う場合は、切替作業時に詰まらないように事前にリハーサルをしておくことをオススメします。

この記事が誰かの助けになれば幸いです。

以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!