[Amazon FSx for NetApp ONTAP] エクスポートポリシーでボリュームにアクセスできるクライアントを制御してみた

ACLで表現しづらい部分はエクスポートポリシーで表現しよう
2022.12.12

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

SVM毎にアクセス元のIPアドレスを制限したいな

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

皆さんは「Amazon FSx for NetApp ONTAP(以降FSx for ONTAP)のSVM毎にアクセス元のIPアドレスを制御したいな」と思ったことはありますか? 私はあります。

FSx for ONTAPではSVM毎にセキュリティグループを割り当てることはできず、ファイルシステム単位でセキュリティグループを割り当てることになります。

これはFSx for ONTAPファイルシステムのENIをファイルシステムとファイルシステムのSVMで共有しているからです。

そのため、SVMが複数あり、許可したいIPアドレスがそれぞれ異なる場合であっても、セキュリティグループでは各SVMが許可したいIPアドレス全てを許可する必要があります。

とは言っても、「あるSVMには特定IPアドレスからのみアクセスできるように制限したい」といった需要があると思います。

FSx for ONTAPではそんな要望を叶えてくれる、エクスポートポリシーという機能があります。

エクスポートポリシーを使うことによって、ボリュームとqtree毎にアクセス可能なクライアント、プロトコル、認証方式を制御することが可能です。

試してみたので紹介します。

いきなりまとめ

  • エクスポートポリシーとは、ONTAPのボリューム、qtreeに対するNFSおよびSMBを使ったのアクセスを制御するポリシー
  • エクスポートポリシーはSVM単位で管理する
  • 各ボリューム、qtreeには1つのエクスポートポリシーが割り当てられる
  • デフォルトではdefaultというエクスポートポリシーが割り当てられる
    • defaultのエクスポートポリシーを削除することはできない
  • エクスポートポリシーには複数のルールを設定することができる
  • エクスポートポリシー内のエクスポートルールに設定したインデックスが若い番号からルールを評価する
    • 明示的に許可するルールがなければ暗黙的に拒否される
  • エクスポートルールでは、クライアントのIPアドレスやボリューム、qtreeに対してアクセスするときのプロトコル、認証に使用したプロトコルなどの情報を用いて、アクセスを許可/拒否することができる
    • 10.0.0.0/24からKerberos認証で認証されたクライアントのSMBのアクセスは読み取りのみ許可する」といった制御が可能
  • NFSの場合、上位のジャンクションパスのボリューム、qtreeのエクスポートポリシーで読み取りを許可しなければ下位のジャンクションパスのボリューム、qtreeにアクセスできない

エクスポートポリシーとは

エクスポートポリシーとは、ONTAPのボリューム、qtreeに対するNFSおよびSMBを使ったのアクセスを制御するポリシーのことです。

各ボリューム、qtreeには1つのエクスポートポリシーが関連付けられます。

ボリューム、qtree作成時にエクスポートポリシーを指定しない場合はdefaultというエクスポートポリシーが適用されます。そのためデフォルトのエクスポートポリシーをカスタマイズしてあげれば、エクスポートポリシーを明示的に指定していないボリューム、qtreeへのアクセス制御を簡単に行うことができます。なお、このdefaultというエクスポートポリシーのルールを変更することは可能ですが、ポリシー自体を削除することはできません。

また、エクスポートポリシーはSVM単位で管理します。エクスポートポリシーを作成したSVM上でしか、そのエクスポートポリシーは使用できません。

エクスポートポリシーには複数のルールを設定することができます。エクスポートルール内のルールはインデックスの番号が若いものから評価されます。ルールを評価していった結果、明示的に許可するルールがなければ、暗黙的な拒否となります。イメージとしてはVPCのNetwork ACLが近しいですね。

エクスポートポリシーのルールでは主に以下パラメーターを指定します。

  • Vserver :
    • SVMの名前
  • Policy Name :
    • エクスポートポリシーの名前
  • Rule Index :
    • エクスポートルールのインデックス
  • List of Client Match :
    • クライアントのホスト名、IPアドレス、ネットグループ、またはドメインのリスト
    • 最大文字数は4096文字
    • 次は各指定例
    • ホスト名を指定する場合 : test-host
    • IPアドレスを指定する場合 : 10.0.0.1 or 10.0.0.1/32 or 10.0.0.1/255.255.255.255
    • ネットワークアドレスを指定する場合 : 10.0.0.0/24 or 10.0.0.0/255.255.255.0
    • ネットグループを指定する場合 : @netgroup
    • ドメイン名を指定する場合 : .non-97.net
  • Access Protocol :
    • ボリューム、qtreeに対してアクセスするときのプロトコル
    • 次から選択可能
    • any : いずれかのファイルアクセスプロトコル
    • nfs : NFSのいずれかのバージョン
    • nfs3 : NFSv3
    • nfs4 : NFSv4
    • cifs: SMB / CIFS
  • RO Access Rule :
    • クライアントの読み取りを許可するセキュリティスタイルを指定
    • 複数のセキュリティスタイルを指定するには、,で指定する
    • RO Access RuleRW Access Ruleよりも優先されるため、特定のプロトコルに書き込み権限が必要な場合は、RO Access Ruleにも含める必要がある
    • 次から選択可能
    • sys : AUTH_SYSで認証されたクライアントに読み取りを許可する
    • krb5 : Kerberos v5で認証されたクライアントに読み取りを許可する
    • krb5i : Kerberos v5で認証され、チェックサムを使用した整合性チェックをしているクライアントに読み取りを許可する
    • krb5p : Kerberos v5で認証され、トラフィックを暗号化したクライアントに読み取りを許可する
    • ntlm : NTLMで認証されたクライアントに読み取りを許可する
    • any : いずれの認証方法のクライアントに対しても読み取りを許可する
    • none : 匿名ユーザーとして読み取りを許可する
    • never : 読み取りを拒否する
  • RW Access Rule :
    • クライアントの読み書きを許可するセキュリティスタイルを指定
    • 複数のセキュリティスタイルを指定するには、,で指定する
    • 指定できる値はRO Access Ruleと同じ

これにより、「10.0.0.0/24からKerberos認証で認証されたクライアントのSMBのアクセスは読み取りのみ許可する」などの制御が可能になります。

その他のパラメーターや詳細な説明はNetAppのKB、公式ドキュメント、vserver export-policy rule createをご覧ください。

エクスポートポリシーの注意すべき点としては、NFSでアクセスする場合、そのボリューム、qtreeにアクセスできるかは、そのボリューム、qtreeに設定されたエクスポートポリシーだけでなく、上位のジャンクションパスのボリューム、qtreeのエクスポートポリシーの影響を受けるという点です。

上位レベルのジャンクションでネストされたジャンクションよりも制限が厳しいエクスポートポリシーを設定した場合は、下位レベルのジャンクションへのアクセスに失敗する可能性があります。

上位レベルのジャンクションには下位レベルのジャンクションよりも制限が厳しくないエクスポートポリシーを設定するようにしてください。

FlexVol のエクスポートポリシーの制限とネストされたジャンクション

上位のジャンクションパスのボリューム、qtreeのエクスポートポリシーで読み取りを許可しなければ下位のジャンクションパスのボリューム、qtreeにアクセスできないようです。

そのため、ボリュームが階層構造になっている場合は、階層が深くなる毎に徐々にアクセス制御を厳しくしていくと良いでしょう。

検証環境

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

エクスポートポリシーでボリュームにアクセスできるクライアントを制御してみた検証環境構成図

ボリュームに割り当てたエクスポートルールを変更して、各クライアントからのアクセスを制御します。

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

検証で使用したFSx for ONTAPとSVMは以下の通りです。

# FSx for ONTAPファイルシステム
$ aws fsx describe-file-systems
{
    "FileSystems": [
        {
            "OwnerId": "<AWSアカウントID>",
            "CreationTime": "2022-12-09T02:22:30.877000+00:00",
            "FileSystemId": "fs-0f615ebf79c53ac7d",
            "FileSystemType": "ONTAP",
            "Lifecycle": "AVAILABLE",
            "StorageCapacity": 1024,
            "StorageType": "SSD",
            "VpcId": "vpc-08b84da1f793ed513",
            "SubnetIds": [
                "subnet-08dc789896a48a3b4"
            ],
            "NetworkInterfaceIds": [
                "eni-00748bd8abb5d9364",
                "eni-08b225e6eb80d81ca"
            ],
            "KmsKeyId": "arn:aws:kms:us-east-1:<AWSアカウントID>:key/365ae19c-8016-4963-9afd-05f703509254",
            "ResourceARN": "arn:aws:fsx:us-east-1:<AWSアカウントID>:file-system/fs-0f615ebf79c53ac7d",
            "Tags": [
                {
                    "Key": "aws:cloudformation:stack-name",
                    "Value": "FsxnStack"
                },
                {
                    "Key": "aws:cloudformation:logical-id",
                    "Value": "FSxforONTAPfilesystem"
                },
                {
                    "Key": "aws:cloudformation:stack-id",
                    "Value": "arn:aws:cloudformation:us-east-1:<AWSアカウントID>:stack/FsxnStack/78cdb890-5423-11ed-81fb-0eac30df53d1"
                },
                {
                    "Key": "Name",
                    "Value": "fsx-for-ontap-file-system"
                }
            ],
            "OntapConfiguration": {
                "AutomaticBackupRetentionDays": 7,
                "DailyAutomaticBackupStartTime": "16:00",
                "DeploymentType": "SINGLE_AZ_1",
                "Endpoints": {
                    "Intercluster": {
                        "DNSName": "intercluster.fs-0f615ebf79c53ac7d.fsx.us-east-1.amazonaws.com",
                        "IpAddresses": [
                            "10.0.1.75",
                            "10.0.1.119"
                        ]
                    },
                    "Management": {
                        "DNSName": "management.fs-0f615ebf79c53ac7d.fsx.us-east-1.amazonaws.com",
                        "IpAddresses": [
                            "10.0.1.123"
                        ]
                    }
                },
                "DiskIopsConfiguration": {
                    "Mode": "AUTOMATIC",
                    "Iops": 3072
                },
                "PreferredSubnetId": "subnet-08dc789896a48a3b4",
                "ThroughputCapacity": 128,
                "WeeklyMaintenanceStartTime": "6:17:00"
            }
        }
    ]
}

# SVM
$ aws fsx describe-storage-virtual-machines 
{
    "StorageVirtualMachines": [
        {
            "ActiveDirectoryConfiguration": {
                "NetBiosName": "SVM",
                "SelfManagedActiveDirectoryConfiguration": {
                    "DomainName": "corp.non-97.net",
                    "OrganizationalUnitDistinguishedName": "OU=FSxForONTAP,DC=corp,DC=non-97,DC=net",
                    "UserName": "FSxServiceAccount",
                    "DnsIps": [
                        "10.0.1.10"
                    ]
                }
            },
            "CreationTime": "2022-12-09T05:04:40.556000+00:00",
            "Endpoints": {
                "Iscsi": {
                    "DNSName": "iscsi.svm-0c325ec2eef34fc83.fs-0f615ebf79c53ac7d.fsx.us-east-1.amazonaws.com",
                    "IpAddresses": [
                        "10.0.1.100",
                        "10.0.1.113"
                    ]
                },
                "Management": {
                    "DNSName": "svm-0c325ec2eef34fc83.fs-0f615ebf79c53ac7d.fsx.us-east-1.amazonaws.com",
                    "IpAddresses": [
                        "10.0.1.68"
                    ]
                },
                "Nfs": {
                    "DNSName": "svm-0c325ec2eef34fc83.fs-0f615ebf79c53ac7d.fsx.us-east-1.amazonaws.com",
                    "IpAddresses": [
                        "10.0.1.68"
                    ]
                },
                "Smb": {
                    "DNSName": "SVM.corp.non-97.net",
                    "IpAddresses": [
                        "10.0.1.68"
                    ]
                }
            },
            "FileSystemId": "fs-0f615ebf79c53ac7d",
            "Lifecycle": "CREATED",
            "Name": "SVM",
            "ResourceARN": "arn:aws:fsx:us-east-1:<AWSアカウントID>:storage-virtual-machine/fs-0f615ebf79c53ac7d/svm-0c325ec2eef34fc83",
            "StorageVirtualMachineId": "svm-0c325ec2eef34fc83",
            "UUID": "0235d32b-777f-11ed-844e-7b3eb664d03b"
        }
    ]
}

デフォルトで割り当たられているエクスポートポリシーの確認

それではまず、デフォルトで割り当たられているエクスポートポリシーを確認します。

ルートボリュームに割り当てられているエクスポートポリシーを表示します。

FsxId0f615ebf79c53ac7d::> volume show -fields policy
vserver volume   policy
------- -------- ----------------------
SVM     SVM_root fsx-root-volume-policy

defaultではなく、fsx-root-volume-policyというエクスポートポリシーが割り当てられていますね。

エクスポートポリシー一覧を確認すると、もちろんdefaultも存在しています。

FsxId0f615ebf79c53ac7d::> vserver export-policy show
Vserver          Policy Name
---------------  -------------------
SVM              default
SVM              fsx-root-volume-policy
2 entries were displayed.

各エクスポートポリシーのルールを確認してみます。

# 各エクスポートポリシーのルールを確認
FsxId0f615ebf79c53ac7d::> vserver export-policy rule show
             Policy          Rule    Access   Client                RO
Vserver      Name            Index   Protocol Match                 Rule
------------ --------------- ------  -------- --------------------- ---------
SVM          default         1       any      0.0.0.0/0             any
SVM          fsx-root-volume-policy
                             1       any      0.0.0.0/0             any
2 entries were displayed.

# 各エクスポートポリシーのルールの詳細を確認
FsxId0f615ebf79c53ac7d::> vserver export-policy rule show -instance

                                    Vserver: SVM
                                Policy Name: default
                                 Rule Index: 1
                            Access Protocol: any
List of Client Match Hostnames, IP Addresses, Netgroups, or Domains: 0.0.0.0/0
                             RO Access Rule: any
                             RW Access Rule: any
User ID To Which Anonymous Users Are Mapped: 65534
                   Superuser Security Types: any
               Honor SetUID Bits in SETATTR: true
                  Allow Creation of Devices: true

                                    Vserver: SVM
                                Policy Name: fsx-root-volume-policy
                                 Rule Index: 1
                            Access Protocol: any
List of Client Match Hostnames, IP Addresses, Netgroups, or Domains: 0.0.0.0/0
                             RO Access Rule: any
                             RW Access Rule: never
User ID To Which Anonymous Users Are Mapped: 65534
                   Superuser Security Types: any
               Honor SetUID Bits in SETATTR: true
                  Allow Creation of Devices: true
2 entries were displayed.

デフォルトのエクスポートポリシーは全てのアクセスを許可するようなルールが設定されています。一方でfsx-root-volume-policyは全てのアクセスから書き込みを拒否するようなルールが設定されています。ルートボリュームに対する書き込みはさせないようにしているようです。

実際にルートボリュームで書き込みできないことを試してみましょう。

ルートボリュームは以下のようにモードビットで755です。UNIX User Id0なのでrootユーザーであれば書き込みできそうです。

FsxId0f615ebf79c53ac7d::> vserver security file-directory show -vserver SVM -path /

                Vserver: SVM
              File Path: /
      File Inode Number: 64
         Security Style: unix
        Effective Style: unix
         DOS Attributes: 10
 DOS Attributes in Text: ----D---
Expanded Dos Attributes: -
           UNIX User Id: 0
          UNIX Group Id: 0
         UNIX Mode Bits: 755
 UNIX Mode Bits in Text: rwxr-xr-x
                   ACLs: -

NFSクライアントからルートボリュームをNFSv4でマウントして書き込めるか確認してみます。

# NFSクライアントのホスト名を確認
$ hostname
ip-10-0-1-6.ec2.internal

# NFSクライアントのIPアドレスを確認
$ hostname -i
10.0.1.6

# マウントポイントの作成
$ sudo mkdir /mnt/fsxn

# NFSv4でマウントしているものがないことを確認
$ df -hT -t nfs4
df: no file systems processed

# ルートボリュームをNFSv4でマウント
$ sudo mount -t nfs4 svm-0c325ec2eef34fc83.fs-0f615ebf79c53ac7d.fsx.us-east-1.amazonaws.com:/ /mnt/fsxn/

# ルートボリュームをNFSv4でマウントされたことを確認
$ df -hT -t nfs4
Filesystem                                                               Type  Size  Used Avail Use% Mounted on
svm-0c325ec2eef34fc83.fs-0f615ebf79c53ac7d.fsx.us-east-1.amazonaws.com:/ nfs4  973M  256K  973M   1% /mnt/fsxn

# マウントポイントの権限を確認
$ ls -ld /mnt/fsxn/
drwxr-xr-x 5 root root 4096 Dec  9 05:09 /mnt/fsxn/

# マウントポイント配下を確認
$ ls -l /mnt/fsxn/
total 0

# マウントポイント配下に書き込み
$ echo nfs-client-1 | sudo tee /mnt/fsxn/nfs-client-1.txt > /dev/null
tee: /mnt/fsxn/nfs-client-1.txt: Permission denied

マウントはできましたが、書き込みは拒否されましたね。確かにfsx-root-volume-policyのエクスポートルールが効いています。

特定のIPアドレスのみアクセスを許可

ボリュームの作成

次に特定のIPアドレスのみアクセスを許可するようにエクスポートポリシーを設定します。

まずは検証用にボリュームを作成します。作成するボリュームはセキュリティスタイルがUNIXのボリュームと、セキュリティスタイルがNTFSのボリュームです。

# 現在のボリューム一覧を確認
FsxId0f615ebf79c53ac7d::> volume show
Vserver   Volume       Aggregate    State      Type       Size  Available Used%
--------- ------------ ------------ ---------- ---- ---------- ---------- -----
SVM       SVM_root     aggr1        online     RW          1GB    972.5MB    0%

# セキュリティスタイルがUNIXのボリュームを作成
FsxId0f615ebf79c53ac7d::> volume create -volume unix -aggregate aggr1 -size 1G -security-style unix -type RW -junction-path /unix -vserver SVM
[Job 64] Job succeeded: Successful

# セキュリティスタイルがNTFSのボリュームを作成
FsxId0f615ebf79c53ac7d::> volume create -volume ntfs -aggregate aggr1 -size 1G -security-style ntfs -type RW -junction-path /ntfs -vserver SVM
[Job 66] Job succeeded: Successful

# ボリュームのジャンクションパス、セキュリティスタイル、エクスポートポリシーを確認
FsxId0f615ebf79c53ac7d::> volume show -fields junction-path, security-style, policy
vserver volume   policy                 security-style junction-path
------- -------- ---------------------- -------------- -------------
SVM     SVM_root fsx-root-volume-policy unix           /
SVM     ntfs     default                ntfs           /ntfs
SVM     unix     default                unix           /unix
3 entries were displayed.

ボリューム作成時にエクスポートポリシーを指定しなかったのでdefaultが割り当てられていますね。

各NFSクライアントからアクセスできることを確認

エクスポートポリシーの設定をする前に各NFSクライアントからアクセスできることを確認します。

1台目のNFSクライアント(10.0.1.6)で/unixをマウントして、ファイルを追加してみます。

# NFSクライアントのIPアドレスを確認
$ hostname -i
10.0.1.6

# ルートボリュームをマウントしているため、マウントを解除
$ sudo umount /mnt/fsxn/

# /unix をマウント
$ sudo mount -t nfs4 svm-0c325ec2eef34fc83.fs-0f615ebf79c53ac7d.fsx.us-east-1.amazonaws.com:/unix /mnt/fsxn/

# マウントできたことを確認
$ df -hT -t nfs4
Filesystem                                                                   Type  Size  Used Avail Use% Mounted on
svm-0c325ec2eef34fc83.fs-0f615ebf79c53ac7d.fsx.us-east-1.amazonaws.com:/unix nfs4  973M  256K  973M   1% /mnt/fsxn

$ mount | grep nfs4
svm-0c325ec2eef34fc83.fs-0f615ebf79c53ac7d.fsx.us-east-1.amazonaws.com:/unix on /mnt/fsxn type nfs4 (rw,relatime,vers=4.1,rsize=65536,wsize=65536,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.0.1.6,local_lock=none,addr=10.0.1.68)

# マウントポイントの権限を確認
$ ls -ld /mnt/fsxn
drwxr-xr-x 2 root root 4096 Dec  9 05:09 /mnt/fsxn

# ファイルを追加
$ echo nfs-client-1 | sudo tee /mnt/fsxn/nfs-client-1.txt > /dev/null

# ファイルが追加されたことを確認
$ ls -l /mnt/fsxn/
total 0
-rw-r--r-- 1 root root 13 Dec  9 05:21 nfs-client-1.txt

# 追加したファイルの内容を確認
$ cat /mnt/fsxn/nfs-client-1.txt
nfs-client-1

/unixをマウントして、ファイルを追加できましたね。

2台目のNFSクライアント(10.0.1.39)でも同様に/unixをマウントして、ファイルを追加してみます。

# NFSクライアントのホスト名の確認
$ hostname
ip-10-0-1-39.ec2.internal

# NFSクライアントのIPアドレスを確認
$ hostname -i
10.0.1.39

# マウントポイントの作成
$ sudo mkdir /mnt/fsxn

# /unix をマウント
$ sudo mount -t nfs4 svm-0c325ec2eef34fc83.fs-0f615ebf79c53ac7d.fsx.us-east-1.amazonaws.com:/unix /mnt/fsxn/

# マウントできたことを確認
$ df -hT -t nfs4
Filesystem                                                                   Type  Size  Used Avail Use% Mounted on
svm-0c325ec2eef34fc83.fs-0f615ebf79c53ac7d.fsx.us-east-1.amazonaws.com:/unix nfs4  973M  320K  973M   1% /mnt/fsxn

$ mount | grep nfs4
svm-0c325ec2eef34fc83.fs-0f615ebf79c53ac7d.fsx.us-east-1.amazonaws.com:/unix on /mnt/fsxn type nfs4 (rw,relatime,vers=4.1,rsize=65536,wsize=65536,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.0.1.39,local_lock=none,addr=10.0.1.68)

# 1台目のNFSクライアントが書き込んだファイルがあることを確認
$ ls -l /mnt/fsxn/
total 0
-rw-r--r-- 1 root root 13 Dec  9 05:21 nfs-client-1.txt

# ファイルを追加
$ echo nfs-client-2 | sudo tee /mnt/fsxn/nfs-client-2.txt > /dev/null

# ファイルが追加されたことを確認
$ ls -l /mnt/fsxn/
total 0
-rw-r--r-- 1 root root 13 Dec  9 05:21 nfs-client-1.txt
-rw-r--r-- 1 root root 13 Dec  9 05:33 nfs-client-2.txt

# 追加したファイルの内容を確認
$ cat /mnt/fsxn/nfs-client-2.txt
nfs-client-2

2台目のNFSクライアントも/unixをマウントして、ファイルを追加できましたね。

エクスポートポリシーの作成

それではエクスポートポリシーを作成します。

今回はtest-policyというエクスポートポリシーを作成します。エクスポートポリシーの作成はvserver export-policy createで行います。

# エクスポートポリシーの作成
FsxId0f615ebf79c53ac7d::> vserver export-policy create -vserver SVM -policyname test-policy

# エクスポートポリシーが作成されたことを確認
FsxId0f615ebf79c53ac7d::> export-policy show
Vserver          Policy Name
---------------  -------------------
SVM              custome-policy
SVM              default
SVM              fsx-root-volume-policy
SVM              test-policy
4 entries were displayed.

# 作成したエクスポートポリシーの詳細を確認
FsxId0f615ebf79c53ac7d::> export-policy show -policyname test-policy -instance

    Vserver: SVM
Policy Name: test-policy

次に作成したエクスポートポリシーにエクスポートルールを作成します。

作成するエクスポートルールは「1台目のNFSクライアントのIPアドレスのみ読み書きを許可する」というものです。明示的な許可がないため、2台目のNFSクライアントからアクセスする場合は暗黙的に拒否されます。

エクスポートルールの作成はvserver export-policy rule createで行います。

# エクスポートポリシーにエクスポートルールが何も設定されていないことを確認
FsxId0f615ebf79c53ac7d::> export-policy rule show -policyname test-policy
There are no entries matching your query.

# エクスポートルールの作成
FsxId0f615ebf79c53ac7d::> export-policy rule create -vserver SVM -policyname test-policy -ruleindex 1 -protocol any -clientmatch 10.0.1.6/32 -rorule any -rwrule any

# エクスポートルールが作成されたことを確認
FsxId0f615ebf79c53ac7d::> export-policy rule show -policyname test-policy
             Policy          Rule    Access   Client                RO
Vserver      Name            Index   Protocol Match                 Rule
------------ --------------- ------  -------- --------------------- ---------
SVM          test-policy     1       any      10.0.1.6/32           any

# 作成したエクスポートルールの詳細を確認
FsxId0f615ebf79c53ac7d::> export-policy rule show -policyname test-policy -instance

                                    Vserver: SVM
                                Policy Name: test-policy
                                 Rule Index: 1
                            Access Protocol: any
List of Client Match Hostnames, IP Addresses, Netgroups, or Domains: 10.0.1.6/32
                             RO Access Rule: any
                             RW Access Rule: any
User ID To Which Anonymous Users Are Mapped: 65534
                   Superuser Security Types: none
               Honor SetUID Bits in SETATTR: true
                  Allow Creation of Devices: true

エクスポートルールを作成しました。

エクスポートポリシーをボリュームに割り当てます。

# エクスポートポリシーをボリュームに割り当て
FsxId0f615ebf79c53ac7d::> volume modify -volume unix -policy test-policy
Volume modify successful on volume unix of Vserver SVM.

# エクスポートポリシーがボリュームに割り当てられたことを確認
FsxId0f615ebf79c53ac7d::> volume show -volume unix -fields policy
vserver volume policy
------- ------ -----------
SVM     unix   test-policy

動作確認

それでは動作確認です。

エクスポートポリシーで許可していない2台目のNFSクライアント(10.0.1.39)で/unixをマウントできるか確認してみます。

# NFSクライアントのIPアドレスを確認
$ hostname -i
10.0.1.39

# マウントしたままだったので、すぐさまエクスポートポリシーが適用されるか確認
$ ls -l /mnt/fsxn/
total 0
-rw-r--r-- 1 root root 13 Dec  9 05:21 nfs-client-1.txt
-rw-r--r-- 1 root root 13 Dec  9 05:33 nfs-client-2.txt

$ cat /mnt/fsxn/nfs-client-2.txt
nfs-client-2

# ファイルの上書き
$ echo nfs-client-2 | sudo tee /mnt/fsxn/nfs-client-2.txt > /dev/null

# 上書きされたか確認
$ ls -l /mnt/fsxn/
total 0
-rw-r--r-- 1 root root 13 Dec  9 05:21 nfs-client-1.txt
-rw-r--r-- 1 root root 13 Dec  9 05:36 nfs-client-2.txt

# 一度アンマウント
$ sudo umount /mnt/fsxn

# 再マウント
$ sudo mount -t nfs4 svm-0c325ec2eef34fc83.fs-0f615ebf79c53ac7d.fsx.us-east-1.amazonaws.com:/unix /mnt/fsxn/
mount.nfs4: access denied by server while mounting svm-0c325ec2eef34fc83.fs-0f615ebf79c53ac7d.fsx.us-east-1.amazonaws.com:/unix

マウントを解除するまではエクスポート読み書きが出来ました。一度アンマウントして、再マウントしようとすると拒否されました。エクスポートポリシーが効いていますね。

次にエクスポートポリシーで許可している1台目のNFSクライアント(10.0.1.6)で/unixをマウントできるか確認してみます。

# NFSクライアントのIPアドレスを確認
$ hostname -i
10.0.1.6

# アンマウント前にマウントポイント配下にアクセスできることを確認
$ ls -l /mnt/fsxn/
total 0
-rw-r--r-- 1 root root 13 Dec  9 05:21 nfs-client-1.txt
-rw-r--r-- 1 root root 13 Dec  9 05:36 nfs-client-2.txt

# 一度アンマウント
$ sudo umount /mnt/fsxn

# 再マウント
$ sudo mount -t nfs4 svm-0c325ec2eef34fc83.fs-0f615ebf79c53ac7d.fsx.us-east-1.amazonaws.com:/unix /mnt/fsxn/

# マウントポイント配下にアクセスできることを確認
$ ls -l /mnt/fsxn/
total 0
-rw-r--r-- 1 root root 13 Dec  9 05:21 nfs-client-1.txt
-rw-r--r-- 1 root root 13 Dec  9 05:36 nfs-client-2.txt

エクスポートポリシーで許可している1台目のNFSクライアント(10.0.1.6)では継続して/unixにアクセスできることを確認できました。

特定のプロトコルのアクセスを拒否

NFSv3でマウントできることを確認

次に特定のプロトコルに対してアクセスを拒否できることを確認します。

拒否したいプロトコルはNFSv3とします。

比較用に1台目のNFSクライアント(10.0.1.6)からNFSv3で/unixをマウントできることを確認します。

# NFSクライアントのIPアドレスを確認
$ hostname -i
10.0.1.6

# NFSv4でマウントしているのでアンマウント
$ sudo umount /mnt/fsxn

# NFSv3でマウント
$ sudo mount -t nfs -o vers=3 svm-0c325ec2eef34fc83.fs-0f615ebf79c53ac7d.fsx.us-east-1.amazonaws.com:/unix /mnt/fsxn/

# NFSv3でマウントしていることを確認
$ df -hT -t nfs
Filesystem                                                                   Type  Size  Used Avail Use% Mounted on
svm-0c325ec2eef34fc83.fs-0f615ebf79c53ac7d.fsx.us-east-1.amazonaws.com:/unix nfs   973M  320K  973M   1% /mnt/fsxn

$ mount | grep nfs
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime)
svm-0c325ec2eef34fc83.fs-0f615ebf79c53ac7d.fsx.us-east-1.amazonaws.com:/unix on /mnt/fsxn type nfs (rw,relatime,vers=3,rsize=65536,wsize=65536,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=10.0.1.68,mountvers=3,mountport=635,mountproto=udp,local_lock=none,addr=10.0.1.68)

NFSv3でマウントできることを確認できました。

エクスポートルールの編集

それでは、エクスポートルールの編集をします。

NFSv3によるアクセスは拒否して、NFSv4による1台目のNFSクライアント(10.0.1.6/32)からのアクセスは許可したいため、以下のようにエクスポートルールを設定します。

  1. Index 1 : NFSv3によるアクセスを拒否するエクスポートルール
  2. Index 2 : 1台目のNFSクライアント(10.0.1.6/32)からのアクセスを許可するエクスポートルール

エクスポートルールのインデックスの変更が必要になります。エクスポートルールのインデックスの変更はvserver export-policy rule setindexで行います。

# 既存エクスポートルールのインデックスを 1 から 2 に変更
FsxId0f615ebf79c53ac7d::> export-policy rule setindex -vserver SVM -policyname test-policy -ruleindex 1 -newruleindex 2

# 既存エクスポートルールのインデックスが 1 から 2 に変更されたことを確認
FsxId0f615ebf79c53ac7d::> export-policy rule show -policyname test-policy
             Policy          Rule    Access   Client                RO
Vserver      Name            Index   Protocol Match                 Rule
------------ --------------- ------  -------- --------------------- ---------
SVM          test-policy     2       any      10.0.1.6/32           any

# NFSv3によるアクセスを拒否するエクスポートルールの作成
FsxId0f615ebf79c53ac7d::> export-policy rule create -vserver SVM -policyname test-policy -ruleindex 1 -protocol nfs3 -clientmatch 0.0.0.0/0 -rorule never -rwrule never

# NFSv3によるアクセスを拒否するエクスポートルールが作成されたことを確認
FsxId0f615ebf79c53ac7d::> export-policy rule show -policyname test-policy
             Policy          Rule    Access   Client                RO
Vserver      Name            Index   Protocol Match                 Rule
------------ --------------- ------  -------- --------------------- ---------
SVM          test-policy     1       nfs3     0.0.0.0/0             never
SVM          test-policy     2       any      10.0.1.6/32           any
2 entries were displayed.

# 作成したエクスポートルールの詳細を確認
FsxId0f615ebf79c53ac7d::> export-policy rule show -policyname test-policy -ruleindex 1 -instance

                                    Vserver: SVM
                                Policy Name: test-policy
                                 Rule Index: 1
                            Access Protocol: nfs3
List of Client Match Hostnames, IP Addresses, Netgroups, or Domains: 0.0.0.0/0
                             RO Access Rule: never
                             RW Access Rule: never
User ID To Which Anonymous Users Are Mapped: 65534
                   Superuser Security Types: none
               Honor SetUID Bits in SETATTR: true
                  Allow Creation of Devices: true

動作確認

それでは動作確認です。

NFSv3でアクセスできるか確認します。

# NFSクライアントのIPアドレスを確認
$ hostname -i
10.0.1.6

# マウントしたままだったので、すぐさまエクスポートポリシーが適用されるか確認
$ ls -l /mnt/fsxn/
ls: cannot open directory /mnt/fsxn/: Stale file handle

$ cat /mnt/fsxn/nfs-client-1.txt
cat: /mnt/fsxn/nfs-client-1.txt: Permission denied

# 一度アンマウント
$ sudo umount /mnt/fsxn/

# NFSv3で再マウント
$ sudo mount -t nfs -o vers=3 svm-0c325ec2eef34fc83.fs-0f615ebf79c53ac7d.fsx.us-east-1.amazonaws.com:/unix /mnt/fsxn/
mount.nfs: access denied by server while mounting svm-0c325ec2eef34fc83.fs-0f615ebf79c53ac7d.fsx.us-east-1.amazonaws.com:/unix

# NFSv3マウント時のメッセージを確認
$ sudo mount -t nfs -o vers=3 svm-0c325ec2eef34fc83.fs-0f615ebf79c53ac7d.fsx.us-east-1.amazonaws.com:/unix /mnt/fsxn/ -v
mount.nfs: timeout set for Fri Dec  9 08:27:10 2022
mount.nfs: trying text-based options 'vers=3,addr=10.0.1.68'
mount.nfs: prog 100003, trying vers=3, prot=6
mount.nfs: trying 10.0.1.68 prog 100003 vers 3 prot TCP port 2049
mount.nfs: prog 100005, trying vers=3, prot=17
mount.nfs: trying 10.0.1.68 prog 100005 vers 3 prot UDP port 635
mount.nfs: mount(2): Permission denied
mount.nfs: access denied by server while mounting svm-0c325ec2eef34fc83.fs-0f615ebf79c53ac7d.fsx.us-east-1.amazonaws.com:/unix

# NFSv3でマウントできていないことを確認
$ df -hT -t nfs
df: no file systems processed

$ mount | grep nfs
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime)

NFSv3でアクセスしようとすると拒否されることが分かりました。

今回は再マウントしなくとも拒否されましたね。特定のIPアドレスのみアクセスを許可するようなエクスポートポリシーを設定した場合は暗黙的な拒否でした。もしかしたら暗黙的な拒否は再マウントが必要で、明示的な拒否は再マウントが不要かもしれません。

続いて、NFSv4では継続してマウントできることを確認します。

# NFSv4でマウント
$ sudo mount -t nfs -o vers=4.1 svm-0c325ec2eef34fc83.fs-0f615ebf79c53ac7d.fsx.us-east-1.amazonaws.com:/unix /mnt/fsxn/

# NFSv4でマウントできていることを確認
$ df -hT -t nfs4
Filesystem                                                                   Type  Size  Used Avail Use% Mounted on
svm-0c325ec2eef34fc83.fs-0f615ebf79c53ac7d.fsx.us-east-1.amazonaws.com:/unix nfs4  973M  384K  973M   1% /mnt/fsxn

$ mount | grep nfs
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime)
svm-0c325ec2eef34fc83.fs-0f615ebf79c53ac7d.fsx.us-east-1.amazonaws.com:/unix on /mnt/fsxn type nfs4 (rw,relatime,vers=4.1,rsize=65536,wsize=65536,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.0.1.6,local_lock=none,addr=10.0.1.68)

# マウントポイント配下を確認
$ ls -l /mnt/fsxn/
total 0
-rw-r--r-- 1 root root 13 Dec  9 05:21 nfs-client-1.txt
-rw-r--r-- 1 root root 13 Dec  9 05:36 nfs-client-2.txt

NFSv4では継続してマウントできました。エクスポートルールのインデックスを理解すれば、細かいアクセス制限を行うことができそうです。

なお、SVM全体でNFSv3を無効化したい場合は、SVMのNFSの設定でNFSv3を無効化する方が簡単です。デフォルトではNFSv3は有効化されています。詳細なNFSの設定は以下の通りです。

FsxId0f615ebf79c53ac7d::> set advanced

Warning: These advanced commands are potentially dangerous; use them only when directed to do so by NetApp personnel.
Do you want to continue? {y|n}: y

# 現在のNFSの設定確認
FsxId0f615ebf79c53ac7d::*> nfs show -instance

                                           Vserver: SVM
                                General NFS Access: true
             RPC GSS Context Cache High Water Mark: 0
                              RPC GSS Context Idle: 0
                                            NFS v3: enabled
                                          NFS v4.0: enabled
                                      UDP Protocol: enabled
                                      TCP Protocol: enabled
                              Default Windows User: -
                       Enable NFSv3 EJUKEBOX error: true
 Require All NFSv3 Reads to Return Read Attributes: false
Show Change in FSID as NFSv3 Clients Traverse Filesystems: enabled
Enable the Dropping of a Connection When an NFSv3 Request is Dropped: enabled
                Vserver NTFS Unix Security Options: use_export_policy
                     Vserver Change Ownership Mode: use_export_policy
                        NFS Response Trace Enabled: false
                    NFS Response Trigger (in secs): 60
                 UDP Maximum Transfer Size (bytes): 32768
                 TCP Maximum Transfer Size (bytes): 65536
                               NFSv4.0 ACL Support: disabled
                   NFSv4.0 Read Delegation Support: disabled
                  NFSv4.0 Write Delegation Support: disabled
Show Change in FSID as NFSv4 Clients Traverse Filesystems: enabled
                          NFSv4.0 Referral Support: disabled
                           NFSv4 ID Mapping Domain: ec2.internal
NFSv4 Validate UTF-8 Encoding of Symbolic Link Data: disabled
               NFSv4 Lease Timeout Value (in secs): 30
               NFSv4 Grace Timeout Value (in secs): 45
Preserves and Modifies NFSv4 ACL (and NTFS File Permissions in Unified Security Style): enabled
                     NFSv4.1 Minor Version Support: enabled
                                     Rquota Enable: disabled
                  NFSv4.1 Implementation ID Domain: netapp.com
                    NFSv4.1 Implementation ID Name: NetApp Release 9.11.1P3
                    NFSv4.1 Implementation ID Date: Thu Sep 29 16:06:51 2022
                      NFSv4.1 Parallel NFS Support: disabled
                          NFSv4.1 Referral Support: disabled
                               NFSv4.1 ACL Support: disabled
                              NFS vStorage Support: disabled
               NFSv4 Support for Numeric Owner IDs: enabled
                             Default Windows Group: -
                   NFSv4.1 Read Delegation Support: disabled
                  NFSv4.1 Write Delegation Support: disabled
Number of Slots in the NFSv4.x Session slot tables: 180
Size of the Reply that will be Cached in Each NFSv4.x Session Slot (in bytes): 640
                    Maximum Number of ACEs per ACL: 400
                               NFS Mount Root Only: enabled
                                     NFS Root Only: disabled
                  AUTH_SYS Extended Groups Enabled: disabled
    AUTH_SYS and RPCSEC_GSS Auxillary Groups Limit: 32
 Validation of Qtree IDs for Qtree File Operations: enabled
                             NFS Mount Daemon Port: 635
                         Network Lock Manager Port: 4045
                       Network Status Monitor Port: 4046
                             NFS Quota Daemon Port: 4049
               Permitted Kerberos Encryption Types: des, des3, aes-128, aes-256
                                 Showmount Enabled: enabled
Set the Protocol Used for Name Services Lookups for Exports: udp
           Map Unknown UID to Default Windows User: enable
  DNS Domain Search Enabled During Netgroup Lookup: enabled
Trust No-Match Result from Any Name Service Switch Source During Netgroup Lookup: disabled
  Display maximum NT ACL Permissions to NFS Client: disabled
                       NFSv3 MS-DOS Client Support: disabled
       Ignore the NT ACL Check for NFS User 'root': disabled
Time To Live Value (in msecs) of a Positive Cached Credential: 86400000
Time To Live Value (in msecs) of a Negative Cached Credential: 7200000
Skip Permission Check for NFS Write Calls from Root/Owner: disabled
          Use 64 Bits for NFSv3 FSIDs and File IDs: disabled
Ignore Client Specified Mode Bits and Preserve Inherited NFSv4 ACL When Creating New Files or Directories: disabled
           Fallback to Unconverted Filename Search: disabled
              I/O Count to Be Grouped as a Session: 5000
Duration for I/O to Be Grouped as a Session (Secs): 120
       Enable or disable Checksum for Replay-Cache: enabled
Harvest timeout (in msecs) for a Cached Credential: 86400000
        Idle Connection Timeout Value (in seconds): 360
                Are Idle NFS Connections Supported: enabled
   Hide Snapshot Directory under NFSv3 Mount Point: disabled
              Provide Root Path as Showmount State: disabled
        Use 64 Bits for NFSv4.x FSIDs and File IDs: enabled
                    NFSV4.2 Security Label Support: disabled
                                     RDMA Protocol: enabled

Kerberos認証をしたクライアントのみ書き込みを許可

CIFSサーバーのオプションでエクスポートポリシーを有効化

次にKerberos認証をしたクライアントのみ書き込みを許可するようにエクスポートポリシーを設定します。

こちらの検証はSMBで行います。

デフォルトのCIFSサーバーの設定ではエクスポートポリシーが有効化されていません。

そのため、SMBでアクセスした場合はルートボリュームや/unixに対する書き込みも行えます。

AD DCからルートボリュームのファイル共有c$をZドライブにマウントして、テキストファイルを追加できるか確認したところ、できてしまいました。

# 現在のユーザー確認
> whoami -fqdn
CN=Administrator,CN=Users,DC=corp,DC=non-97,DC=net

# ルートボリュームのファイル共有 c$ をZドライブにマウント
> net use Z: \\SVM.CORP.NON-97.NET\c$
The command completed successfully.

# マウントできたことを確認
> Get-PSDrive

Name           Used (GB)     Free (GB) Provider      Root                                               CurrentLocation
----           ---------     --------- --------      ----                                               ---------------
Alias                                  Alias
C                  15.94         14.06 FileSystem    C:\                                            Users\Administrator
Cert                                   Certificate   \
Env                                    Environment
Function                               Function
HKCU                                   Registry      HKEY_CURRENT_USER
HKLM                                   Registry      HKEY_LOCAL_MACHINE
Variable                               Variable
WSMan                                  WSMan
Z                   0.00          0.95 FileSystem    \\SVM.CORP.NON-97.NET\c$

# Zドライブ配下を確認
> ls Z:\


    Directory: Z:\


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----l         12/8/2022   7:09 PM                ntfs
d----l         12/8/2022   7:09 PM                unix

# Zドライブ配下にテキストファイルを追加
> echo smb > Z:\smb.txt

# ファイルが追加できたことを確認
> ls Z:\


    Directory: Z:\


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----l         12/8/2022   7:09 PM                ntfs
d----l         12/8/2022   7:09 PM                unix
-a----         12/9/2022  12:46 AM             12 smb.txt

# エクスポートポリシーが効いていないため、IPアドレス制限をしている /unix にもアクセスできる
> ls Z:\unix\


    Directory: Z:\unix


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         12/8/2022   9:21 PM             13 nfs-client-1.txt
-a----         12/8/2022   9:36 PM             13 nfs-client-2.txt


> cat Z:\unix\nfs-client-1.txt
nfs-client-1

そのため、SMBによるアクセスに対してエクスポートポリシーで制御したい場合は、CIFSサーバーでエクスポートポリシーの有効化を行う必要があります。エクスポートポリシーの有効化を行う際は権限を advancedに変更する必要があります。

# CIFSサーバーの設定確認
FsxId0f615ebf79c53ac7d::> cifs options show -instance

Vserver: SVM

  Client Session Timeout : 900
  Default Unix Group     : -
  Default Unix User      : pcuser
  Guest Unix User        : -
  Read Grants Exec       : disabled
  Read Only Delete       : disabled
  WINS Servers           : -

# 権限を advanced に変更
FsxId0f615ebf79c53ac7d::> set advanced

Warning: These advanced commands are potentially dangerous; use them only when directed to do so by NetApp personnel.
Do you want to continue? {y|n}: y

# CIFSサーバーの設定確認
FsxId0f615ebf79c53ac7d::*> cifs options show

Vserver: SVM

                            Client Session Timeout: 900
                              Copy Offload Enabled: true
                                Default Unix Group: -
                                 Default Unix User: pcuser
                                   Guest Unix User: -
               Are Administrators mapped to 'root': true
           Is Advanced Sparse File Support Enabled: true
                  Is Fsctl File Level Trim Enabled: true
                  Direct-Copy Copy Offload Enabled: true
                           Export Policies Enabled: false
            Grant Unix Group Permissions to Others: false
                          Is Advertise DFS Enabled: false
     Is Client Duplicate Session Detection Enabled: true
               Is Client Version Reporting Enabled: true
                                    Is DAC Enabled: false
                      Is Fake Open Support Enabled: true
                         Is Hide Dot Files Enabled: false
                              Is Large MTU Enabled: true
                             Is Local Auth Enabled: true
                 Is Local Users and Groups Enabled: true
                           Is Multichannel Enabled: true
            Is NetBIOS over TCP (port 139) Enabled: true
               Is NBNS over UDP (port 137) Enabled: false
                               Is Referral Enabled: false
             Is Search Short Names Support Enabled: false
  Is Trusted Domain Enumeration And Search Enabled: true
                        Is UNIX Extensions Enabled: false
          Is Use Junction as Reparse Point Enabled: true
                               Max Multiplex Count: 255
          Max Connections per Multichannel Session: 32
                 Max LIFs per Multichannel Session: 256
              Max Same User Session Per Connection: 2500
                 Max Same Tree Connect Per Session: 5000
                      Max Opens Same File Per Tree: 1000
                          Max Watches Set Per Tree: 500
                   Is Path Component Cache Enabled: true
    NT ACLs on UNIX Security Style Volumes Enabled: true
                                  Read Grants Exec: disabled
                                  Read Only Delete: disabled
                  Reported File System Sector Size: 4096
                                Restrict Anonymous: no-enumeration
                              Shadowcopy Dir Depth: 5
                                Shadowcopy Enabled: true
                                      SMB1 Enabled: false
                  Max Buffer Size for SMB1 Message: 65535
                                      SMB2 Enabled: true
                                      SMB3 Enabled: true
                                    SMB3.1 Enabled: true
            Map Null User to Windows User or Group: -
                                      WINS Servers: -
         Report Widelink as Reparse Point Versions: SMB1
                              Max Credits to Grant: 128
Check Share Permission for NetShareEnumAll Request: false

# CIFSサーバーでエクスポートポリシーを有効化
FsxId0f615ebf79c53ac7d::*> vserver cifs options modify -vserver SVM -is-exportpolicy-enabled true

# CIFSサーバーでエクスポートポリシーが有効化されたか確認
FsxId0f615ebf79c53ac7d::*> cifs options show -fields is-exportpolicy-enabled
vserver is-exportpolicy-enabled
------- -----------------------
SVM     true

# 権限を admin に戻す
FsxId0f615ebf79c53ac7d::*> set admin

CIFSサーバーでエクスポートポリシーを有効化しました。

この状態で再度ルートボリュームに対して書き込みを行います。

# ルートボリュームに対してテキストファイルを追加
> echo smb2 > Z:\smb2.txt
out-file : Access to the path 'Z:\smb2.txt' is denied.
At line:1 char:1
+ echo smb2 > Z:\smb2.txt
+ ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OpenError: (:) [Out-File], UnauthorizedAccessException
    + FullyQualifiedErrorId : FileOpenFailure,Microsoft.PowerShell.Commands.OutFileCommand

# テキストファイルが追加されていないことを確認
> ls Z:\


    Directory: Z:\


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----l         12/8/2022   7:09 PM                ntfs
d----l         12/8/2022   7:09 PM                unix
-a----         12/9/2022  12:46 AM             12 smb.txt

ルートボリュームに書き込みをしようとしたら拒否されました。エクスポートポリシーfsx-root-volume-policyが効いていますね。

また、エクスポートポリシーが有効化されたため以下のように/unixに対してアクセス出来なくなりました。

# /unix にアクセスできなくなったことを確認
> ls Z:\unix\
ls : Access is denied
At line:1 char:1
+ ls Z:\unix\
+ ~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (Z:\unix\:String) [Get-ChildItem], UnauthorizedAccessException
    + FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand

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

# /unix 配下のファイルにもアクセスできなくなったことを確認
> cat Z:\unix\nfs-client-1.txt
cat : Access is denied
At line:1 char:1
+ cat Z:\unix\nfs-client-1.txt
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (Z:\unix\nfs-client-1.txt:String) [Get-Content], UnauthorizedAccessExc
   eption
    + FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetContentCommand

cat : Cannot find path 'Z:\unix\nfs-client-1.txt' because it does not exist.
At line:1 char:1
+ cat Z:\unix\nfs-client-1.txt
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Z:\unix\nfs-client-1.txt:String) [Get-Content], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand

エクスポートポリシーの作成

それではエクスポートポリシーの作成を行います。

krb5-policyという名前のエクスポートポリシーを作成します。

# エクスポートポリシーの作成
FsxId0f615ebf79c53ac7d::> export-policy create -vserver SVM -policyname krb5-policy

# エクスポートポリシーが作成されたことを確認
FsxId0f615ebf79c53ac7d::> export-policy show
Vserver          Policy Name
---------------  -------------------
SVM              default
SVM              fsx-root-volume-policy
SVM              krb5-policy
SVM              test-policy
4 entries were displayed.

作成したエクスポートポリシーに「Kerberos認証された場合のみ書き込みを許可する」というエクスポートルールを作成します。

# エクスポートルールの作成
FsxId0f615ebf79c53ac7d::> export-policy rule create -vserver SVM -policyname krb5-policy -ruleindex 1 -protocol any -clientmatch 0.0.0.0/0 -rorule any -rwrule krb5

# エクスポートルールが作成されたことを確認
FsxId0f615ebf79c53ac7d::> export-policy rule show -vserver SVM -policyname krb5-policy
             Policy          Rule    Access   Client                RO
Vserver      Name            Index   Protocol Match                 Rule
------------ --------------- ------  -------- --------------------- ---------
SVM          krb5-policy     1       any      0.0.0.0/0             any

# 作成したエクスポートルールの作用を確認
FsxId0f615ebf79c53ac7d::> export-policy rule show -vserver SVM -policyname krb5-policy -instance

                                    Vserver: SVM
                                Policy Name: krb5-policy
                                 Rule Index: 1
                            Access Protocol: any
List of Client Match Hostnames, IP Addresses, Netgroups, or Domains: 0.0.0.0/0
                             RO Access Rule: any
                             RW Access Rule: krb5
User ID To Which Anonymous Users Are Mapped: 65534
                   Superuser Security Types: none
               Honor SetUID Bits in SETATTR: true
                  Allow Creation of Devices: true

エクスポートルールの作成ができました。

作成したエクスポートポリシーをボリュームntfsに割り当てます。

# ボリューム ntfs にエクスポートポリシーを割り当て
FsxId0f615ebf79c53ac7d::> volume modify -volume ntfs -policy krb5-policy
Volume modify successful on volume ntfs of Vserver SVM.

# ボリューム ntfs にエクスポートポリシーを割り当てられたことを確認
FsxId0f615ebf79c53ac7d::> volume show -fields policy
vserver volume   policy
------- -------- ----------------------
SVM     SVM_root fsx-root-volume-policy
SVM     ntfs     krb5-policy
SVM     unix     test-policy
3 entries were displayed.

ファイル共有の作成

パスが/ntfsのファイル共有shareを作成します。

# CIFSサーバーの確認
FsxId0f615ebf79c53ac7d::> cifs show
            Server          Status    Domain/Workgroup Authentication
Vserver     Name            Admin     Name             Style
----------- --------------- --------- ---------------- --------------
SVM         SVM             up        CORP             domain

# CIFSサーバーの詳細を確認
FsxId0f615ebf79c53ac7d::> cifs show -instance

                                          Vserver: SVM
                         CIFS Server NetBIOS Name: SVM
                    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: -

# 現在のファイル共有を確認
FsxId0f615ebf79c53ac7d::> cifs share show
Vserver        Share         Path              Properties Comment  ACL
-------------- ------------- ----------------- ---------- -------- -----------
SVM            c$            /                 oplocks    -        BUILTIN\Administrators / Full Control
                                               browsable
                                               changenotify
                                               show-previous-versions
SVM            ipc$          /                 browsable  -        -
2 entries were displayed.

# ファイル共有 share の作成
FsxId0f615ebf79c53ac7d::> cifs share create -share-name share -path /ntfs

# ファイル共有が作成されたことを確認
FsxId0f615ebf79c53ac7d::> cifs share show -share-name share
Vserver        Share         Path              Properties Comment  ACL
-------------- ------------- ----------------- ---------- -------- -----------
SVM            share         /ntfs             oplocks    -        Everyone / Full Control
                                               browsable
                                               changenotify
                                               show-previous-versions

ローカルユーザーの作成

Kerberos認証ではない場合に書き込みできないことも確認したいので、CIFSサーバー上にtest-userというローカルユーザーを作成します。

# ローカルユーザー test-user を作成
FsxId0f615ebf79c53ac7d::> cifs users-and-groups local-user create -user-name test-user -is-account-disabled false

Enter the password:
Confirm the password:

# ローカルユーザーが追加されたことを確認
FsxId0f615ebf79c53ac7d::> cifs users-and-groups local-user show
Vserver      User Name                   Full Name            Description
------------ --------------------------- -------------------- -------------
SVM          SVM\Administrator                                Built-in administrator account
SVM          SVM\test-user               -                    -
2 entries were displayed.

AD DCからドメインユーザーで認証して動作確認

それでは動作確認です。

まず、AD DCからドメインのAdministratorユーザーで認証した場合に書き込みができるか確認します。

# 現在のユーザーを確認
> whoami
corp\administrator

# ドメインに参加していることを確認
> Get-WMIObject Win32_ComputerSystem


Domain              : corp.non-97.net
Manufacturer        : Amazon EC2
Model               : t3.micro
Name                : EC2AMAZ-75JBQCK
PrimaryOwnerName    : EC2
TotalPhysicalMemory : 1043886080

# Zドライブに share をマウント
> net use Z: \\SVM.CORP.NON-97.NET\share
The command completed successfully.

# マウントできたことを確認
> Get-PSDrive

Name           Used (GB)     Free (GB) Provider      Root                                               CurrentLocation
----           ---------     --------- --------      ----                                               ---------------
Alias                                  Alias
C                  15.94         14.06 FileSystem    C:\                                            Users\Administrator
Cert                                   Certificate   \
Env                                    Environment
Function                               Function
HKCU                                   Registry      HKEY_CURRENT_USER
HKLM                                   Registry      HKEY_LOCAL_MACHINE
Variable                               Variable
WSMan                                  WSMan
Z                   0.00          0.95 FileSystem    \\SVM.CORP.NON-97.NET\share

# Zドライブ配下を確認
> ls Z:

# Zドライブ配下にファイルを追加
> echo domain-user > Z:\domain-user.txt

# ファイルが追加できたことを確認
> ls Z:


    Directory: Z:\


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         12/9/2022  12:56 AM             28 domain-user.txt

ファイルの追加ができました。ドメインユーザーでの認証は確かにKerberos認証であることが分かりますね。

ドメイン不参加コンピューターからローカルユーザーで認証して動作確認

次にドメイン不参加コンピューターからローカルユーザーで認証した場合に書き込みができるか確認します。

# 現在のユーザーを確認
> whoami
ec2amaz-67ovdlv\ssm-user

# ドメインに参加していないことを確認
> Get-WMIObject Win32_ComputerSystem


Domain              : WORKGROUP
Manufacturer        : Amazon EC2
Model               : t3.micro
Name                : EC2AMAZ-67OVDLV
PrimaryOwnerName    : EC2
TotalPhysicalMemory : 1043886080

# ローカルユーザーの認証情報を使ってZドライブに share をマウント
> net use Z: \\10.0.1.68\share
The password is invalid for \\10.0.1.68\share.

Enter the user name for '10.0.1.68': test-user
Enter the password for 10.0.1.68:
The command completed successfully.

# マウントできたことを確認
> Get-PSDrive

Name           Used (GB)     Free (GB) Provider      Root                                        CurrentLocation
----           ---------     --------- --------      ----                                        ---------------
Alias                                  Alias
C                  13.97         16.03 FileSystem    C:\                                        Windows\system32
Cert                                   Certificate   \
Env                                    Environment
Function                               Function
HKCU                                   Registry      HKEY_CURRENT_USER
HKLM                                   Registry      HKEY_LOCAL_MACHINE
Variable                               Variable
WSMan                                  WSMan
Z                   0.00          0.95 FileSystem    \\10.0.1.68\share

# AD DCからドメインユーザーで認証した際のファイルがあることを確認
> ls Z:


    Directory: Z:\


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         12/9/2022  10:56 AM             28 domain-user.txt

# Zドライブ配下にファイルを追加
> echo local-user > Z:\local-user.txt
out-file : Access to the path 'Z:\local-user.txt' is denied.
At line:1 char:1
+ echo local-user > Z:\local-user.txt
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OpenError: (:) [Out-File], UnauthorizedAccessException
    + FullyQualifiedErrorId : FileOpenFailure,Microsoft.PowerShell.Commands.OutFileCommand

# Zドライブ配下のファイルを削除
> rm Z:\domain-user.txt
rm : Cannot remove item Z:\domain-user.txt: Access to the path 'Z:\domain-user.txt' is denied.
At line:1 char:1
+ rm Z:\domain-user.txt
+ ~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (Z:\domain-user.txt:FileInfo) [Remove-Item], UnauthorizedAccess
   Exception
    + FullyQualifiedErrorId : RemoveFileSystemItemUnAuthorizedAccess,Microsoft.PowerShell.Commands.RemoveItemCo
   mmand

マウントはできましたがファイルの書き込み、および削除をしようとした場合は拒否されました。ローカルユーザーの認証はNTLM認証のようですね。

ドメイン不参加コンピューターからドメインユーザーで認証して動作確認

ドメイン不参加コンピューターからローカルユーザーで認証した場合は書き込みできないことが分かりましたが、ドメイン不参加コンピューターからドメインユーザーで認証した場合は書き込みできるのでしょうか。

NTLMのパススルー認証になるため、書き込みできないと予想しますが確認してみます。

# 現在のユーザーを確認
> whoami
ec2amaz-67ovdlv\ssm-user

# ドメインのAdministratorユーザーの認証情報を使ってZドライブに share をマウント
> net use Z: \\10.0.1.68\share
The password is invalid for \\10.0.1.68\share.

Enter the user name for '10.0.1.68': CORP\Administrator
Enter the password for 10.0.1.68:
The command completed successfully.

# マウントできたことを確認
> Get-PSDrive

Name           Used (GB)     Free (GB) Provider      Root                                        CurrentLocation
----           ---------     --------- --------      ----                                        ---------------
Alias                                  Alias
C                  14.00         15.99 FileSystem    C:\                                        Windows\system32
Cert                                   Certificate   \
Env                                    Environment
Function                               Function
HKCU                                   Registry      HKEY_CURRENT_USER
HKLM                                   Registry      HKEY_LOCAL_MACHINE
Variable                               Variable
WSMan                                  WSMan
Z                   0.00          0.95 FileSystem    \\10.0.1.68\share

# AD DCからドメインユーザーで認証した際のファイルがあることを確認
> ls Z:\


    Directory: Z:\


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         12/9/2022  10:56 AM             28 domain-user.txt


# Zドライブ配下にファイルを追加
> echo domain-user-2 > Z:\domain-user-2.txt
out-file : Access to the path 'Z:\domain-user-2.txt' is denied.
At line:1 char:1
+ echo domain-user-2 > Z:\domain-user-2.txt
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OpenError: (:) [Out-File], UnauthorizedAccessException
    + FullyQualifiedErrorId : FileOpenFailure,Microsoft.PowerShell.Commands.OutFileCommand

やはり書き込みは拒否されました。

NTLM認証をしたクライアントのみ読み書きを許可

エクスポートルールの編集

次にNTLM認証をしたクライアントのみ読み書きを許可するように、エクスポートルールを編集します。

# NTLM認証をしたクライアントのみ読み書きを許可するようにエクスポートルールを編集
FsxId0f615ebf79c53ac7d::> export-policy rule modify -vserver SVM -policyname krb5-policy -ruleindex 1 -rorule ntlm -rwrule ntlm

# エクスポートルールが変更されたことを確認
FsxId0f615ebf79c53ac7d::> export-policy rule show -vserver SVM -policyname krb5-policy -instance

                                    Vserver: SVM
                                Policy Name: krb5-policy
                                 Rule Index: 1
                            Access Protocol: any
List of Client Match Hostnames, IP Addresses, Netgroups, or Domains: 0.0.0.0/0
                             RO Access Rule: ntlm
                             RW Access Rule: ntlm
User ID To Which Anonymous Users Are Mapped: 65534
                   Superuser Security Types: none
               Honor SetUID Bits in SETATTR: true
                  Allow Creation of Devices: true

ドメイン不参加コンピューターからローカルユーザーで認証して動作確認

それでは、ドメイン不参加コンピューターからローカルユーザーで認証して、読み書きができるか確認します。

# 現在のユーザーを確認
> whoami
ec2amaz-67ovdlv\ssm-user

# ドメインに参加していないことを確認
> Get-WMIObject Win32_ComputerSystem


Domain              : WORKGROUP
Manufacturer        : Amazon EC2
Model               : t3.micro
Name                : EC2AMAZ-67OVDLV
PrimaryOwnerName    : EC2
TotalPhysicalMemory : 1043886080

# ローカルユーザーの認証情報を使ってZドライブに share をマウント
> net use Z: \\10.0.1.68\share
The password is invalid for \\10.0.1.68\share.

Enter the user name for '10.0.1.68': test-user
Enter the password for 10.0.1.68:
The command completed successfully.

# マウントできたことを確認
> Get-PSDrive

Name           Used (GB)     Free (GB) Provider      Root                                        CurrentLocation
----           ---------     --------- --------      ----                                        ---------------
Alias                                  Alias
C                  14.00         15.99 FileSystem    C:\                                        Windows\system32
Cert                                   Certificate   \
Env                                    Environment
Function                               Function
HKCU                                   Registry      HKEY_CURRENT_USER
HKLM                                   Registry      HKEY_LOCAL_MACHINE
Variable                               Variable
WSMan                                  WSMan
Z                   0.00          0.95 FileSystem    \\10.0.1.68\share

# AD DCからドメインユーザーで認証した際のファイルがあることを確認
> ls Z:


    Directory: Z:\


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         12/9/2022  10:56 AM             28 domain-user.txt

# Zドライブ配下にファイルを追加
> echo local-user > Z:\local-user.txt

# ファイルが追加されたことを確認
> ls Z:


    Directory: Z:\


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         12/9/2022  10:56 AM             28 domain-user.txt
-a----         12/9/2022  11:30 AM             26 local-user.txt

読み書きできましたね。やはりローカルユーザーを使った認証はNTLM認証であることが分かります。

ドメイン不参加コンピューターからドメインユーザーで認証して動作確認

次にドメイン不参加コンピューターからドメインユーザーで認証した場合に読み書きができるか確認します。

# 現在のユーザーを確認
> whoami
ec2amaz-67ovdlv\ssm-user

# ドメインのAdministratorユーザーの認証情報を使ってZドライブに share をマウント
> net use Z: \\10.0.1.68\share
The password is invalid for \\10.0.1.68\share.

Enter the user name for '10.0.1.68': CORP\Administrator
Enter the password for 10.0.1.68:
The command completed successfully.

# マウントできたことを確認
> Get-PSDrive

Name           Used (GB)     Free (GB) Provider      Root                                        CurrentLocation
----           ---------     --------- --------      ----                                        ---------------
Alias                                  Alias
C                  14.00         15.99 FileSystem    C:\                                        Windows\system32
Cert                                   Certificate   \
Env                                    Environment
Function                               Function
HKCU                                   Registry      HKEY_CURRENT_USER
HKLM                                   Registry      HKEY_LOCAL_MACHINE
Variable                               Variable
WSMan                                  WSMan
Z                   0.00          0.95 FileSystem    \\10.0.1.68\share

# Zドライブ配下を確認
> ls Z:


    Directory: Z:\


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         12/9/2022  10:56 AM             28 domain-user.txt
-a----         12/9/2022  11:30 AM             26 local-user.txt


# Zドライブ配下にファイルを追加
> echo domain-user-2 > Z:\domain-user-2.txt

# ファイルが追加できたことを確認
> ls Z:


    Directory: Z:\


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         12/9/2022  10:56 AM             28 domain-user.txt
-a----         12/9/2022  11:32 AM             30 domain-user-2.txt
-a----         12/9/2022  11:30 AM             26 local-user.txt

読み書きできました。逆に言えばドメイン参加していないコンピューターからのアクセスを拒否したい場合は、NTLMに対しての許可を与えなければよさそうです。

AD DCからドメインユーザーで認証して動作確認

次にAD DCからドメインのAdministratorユーザーで認証した場合に読み書きできるか確認します。

# 現在のユーザーを確認
> whoami
corp\administrator

# マウントしたままだったのでエクスポートポリシーが即座に効いているか確認
# Zドライブ配下の確認
> ls Z:\
ls : Access is denied
At line:1 char:1
+ ls Z:\
+ ~~~~~~
    + CategoryInfo          : PermissionDenied: (Z:\:String) [Get-ChildItem], UnauthorizedAccessException
    + FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand

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

# ファイルの内容出力
> cat Z:\domain-user.txt
cat : Access is denied
At line:1 char:1
+ cat Z:\domain-user.txt
+ ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (Z:\domain-user.txt:String) [Get-Content], UnauthorizedAccessException
    + FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetContentCommand

cat : Cannot find path 'Z:\domain-user.txt' because it does not exist.
At line:1 char:1
+ cat Z:\domain-user.txt
+ ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Z:\domain-user.txt:String) [Get-Content], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand

# アンマウント
> net use Z: /delete
Z: was deleted successfully.

# 再マウント
> net use Z: \\SVM.CORP.NON-97.NET\share
The command completed successfully.

# Zドライブにマウントできたことを確認
> Get-PSDrive

Name           Used (GB)     Free (GB) Provider      Root                                               CurrentLocation
----           ---------     --------- --------      ----                                               ---------------
Alias                                  Alias
C                  15.90         14.10 FileSystem    C:\                                            Users\Administrator
Cert                                   Certificate   \
Env                                    Environment
Function                               Function
HKCU                                   Registry      HKEY_CURRENT_USER
HKLM                                   Registry      HKEY_LOCAL_MACHINE
Variable                               Variable
WSMan                                  WSMan
Z                                      FileSystem    \\SVM.CORP.NON-97.NET\share

# 継続してアクセスできないことを確認
# Zドライブ配下の確認
> ls Z:\
ls : Access is denied
At line:1 char:1
+ ls Z:\
+ ~~~~~~
    + CategoryInfo          : PermissionDenied: (Z:\:String) [Get-ChildItem], UnauthorizedAccessException
    + FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand

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

# ファイルの内容出力
> cat Z:\domain-user.txt
cat : Access is denied
At line:1 char:1
+ cat Z:\domain-user.txt
+ ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (Z:\domain-user.txt:String) [Get-Content], UnauthorizedAccessException
    + FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetContentCommand

cat : Cannot find path 'Z:\domain-user.txt' because it does not exist.
At line:1 char:1
+ cat Z:\domain-user.txt
+ ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Z:\domain-user.txt:String) [Get-Content], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand

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

(PowerShellの別セッションで以下の操作)

# ドメインのAdministratorユーザーの認証情報を使ってZドライブに share をマウント (1回目)
> net use Z: \\SVM.CORP.NON-97.NET\share
The password is invalid for \\SVM.CORP.NON-97.NET\share.

Enter the user name for 'SVM.CORP.NON-97.NET': CORP\Administrator
Enter the password for SVM.CORP.NON-97.NET:
System error 5 has occurred.

Access is denied.

# ドメインのAdministratorユーザーの認証情報を使ってZドライブに share をマウント (2回目)
> net use Z: \\SVM.CORP.NON-97.NET\share
The password is invalid for \\SVM.CORP.NON-97.NET\share.

Enter the user name for 'SVM.CORP.NON-97.NET': corp.non-97.net\Administrator
Enter the password for SVM.CORP.NON-97.NET:
System error 5 has occurred.

Access is denied.

# ドメインの FSxAdmin ユーザーの認証情報を使ってZドライブに share をマウント
> net use Z: \\SVM.CORP.NON-97.NET\share
The password is invalid for \\SVM.CORP.NON-97.NET\share.

Enter the user name for 'SVM.CORP.NON-97.NET': CORP\FSxAdmin
Enter the password for SVM.CORP.NON-97.NET:
System error 5 has occurred.

Access is denied.

Access is deniedとマウントを拒否されました。パスワードが間違っている場合はThe user name or password is incorrect.と表示されるため、Kerberos認証を使用している場合はエクスポートポリシーによって拒否されていることが分かります。

AD DCからローカルユーザーで認証して動作確認

最後にAD DCからローカルユーザーで認証した場合はマウントできるか確認します。

# 現在のユーザーを確認
> whoami
corp\administrator

# ローカルユーザーの認証情報を使ってZドライブに share をマウント
> net use Z: \\SVM.CORP.NON-97.NET\share
The password is invalid for \\SVM.CORP.NON-97.NET\share.

Enter the user name for 'SVM.CORP.NON-97.NET': SVM\test-user
Enter the password for SVM.CORP.NON-97.NET:
The command completed successfully.

# マウントできたことを確認
> Get-PSDrive

Name           Used (GB)     Free (GB) Provider      Root                                               CurrentLocation
----           ---------     --------- --------      ----                                               ---------------
Alias                                  Alias
C                  15.94         14.06 FileSystem    C:\                                            Users\Administrator
Cert                                   Certificate   \
Env                                    Environment
Function                               Function
HKCU                                   Registry      HKEY_CURRENT_USER
HKLM                                   Registry      HKEY_LOCAL_MACHINE
Variable                               Variable
WSMan                                  WSMan
Z                   0.00          0.95 FileSystem    \\SVM.CORP.NON-97.NET\share

# Zドライブ配下を確認
> ls Z:


    Directory: Z:\


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         12/9/2022  12:56 AM             28 domain-user.txt
-a----         12/9/2022   1:32 AM             30 local-user-2.txt
-a----         12/9/2022   1:30 AM             26 local-user.txt

ドメイン参加していてもローカルユーザーで認証すれば、アクセスできました。

ルートボリュームへの読み取りを拒否している状態で配下のボリュームにアクセスできるか

最後にエクスポートポリシーでルートボリュームへの読み取りを拒否している状態で、配下のボリュームにアクセスできるか検証してみます。

NFSv4で/unixをSMBで/ntfsをマウントしています。

# NFSv4で /unix をマウントしていることを確認
$ mount | grep nfs4
svm-0c325ec2eef34fc83.fs-0f615ebf79c53ac7d.fsx.us-east-1.amazonaws.com:/unix on /mnt/fsxn type nfs4 (rw,relatime,vers=4.1,rsize=65536,wsize=65536,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.0.1.6,local_lock=none,addr=10.0.1.68)

# マウントポイント配下にアクセスできることを確認
$ ls -l /mnt/fsxn/
total 0
-rw-r--r-- 1 root root 13 Dec  9 05:21 nfs-client-1.txt
-rw-r--r-- 1 root root 13 Dec  9 05:36 nfs-client-2.txt
# /ntfs のファイル共有 share をZドライブにマウントしていることを確認
> Get-PSDrive

Name           Used (GB)     Free (GB) Provider      Root                                               CurrentLocation
----           ---------     --------- --------      ----                                               ---------------
Alias                                  Alias
C                  15.94         14.06 FileSystem    C:\                                            Users\Administrator
Cert                                   Certificate   \
Env                                    Environment
Function                               Function
HKCU                                   Registry      HKEY_CURRENT_USER
HKLM                                   Registry      HKEY_LOCAL_MACHINE
Variable                               Variable
WSMan                                  WSMan
Z                   0.00          0.95 FileSystem    \\SVM.CORP.NON-97.NET\share

# Zドライブ配下にアクセスできることを確認
> ls Z:


    Directory: Z:\


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         12/9/2022  12:56 AM             28 domain-user.txt
-a----         12/9/2022   1:32 AM             30 local-user-2.txt
-a----         12/9/2022   1:30 AM             26 local-user.txt

この状態でルートボリュームのエクスポートポリシーfsx-root-volume-policyを編集して、読み取りも拒否するようにします。

# 現在のエクスポートルールの確認
FsxId0f615ebf79c53ac7d::> export-policy rule show -policyname fsx-root-volume-policy -instance

                                    Vserver: SVM
                                Policy Name: fsx-root-volume-policy
                                 Rule Index: 1
                            Access Protocol: any
List of Client Match Hostnames, IP Addresses, Netgroups, or Domains: 0.0.0.0/0
                             RO Access Rule: any
                             RW Access Rule: never
User ID To Which Anonymous Users Are Mapped: 65534
                   Superuser Security Types: any
               Honor SetUID Bits in SETATTR: true
                  Allow Creation of Devices: true

# 読み取りを拒否するよう変更
FsxId0f615ebf79c53ac7d::> export-policy rule modify -policyname fsx-root-volume-policy -ruleindex 1 -rorule never

# 変更されたことを確認
FsxId0f615ebf79c53ac7d::> export-policy rule show -policyname fsx-root-volume-policy -instance

                                    Vserver: SVM
                                Policy Name: fsx-root-volume-policy
                                 Rule Index: 1
                            Access Protocol: any
List of Client Match Hostnames, IP Addresses, Netgroups, or Domains: 0.0.0.0/0
                             RO Access Rule: never
                             RW Access Rule: never
User ID To Which Anonymous Users Are Mapped: 65534
                   Superuser Security Types: any
               Honor SetUID Bits in SETATTR: true
                  Allow Creation of Devices: true

それでは、動作確認を行います。

まずはNFSからです。

# NFSクライアントのIPアドレスを確認
$ hostname -i
10.0.1.6

# エクスポートポリシーが即座に効いているか確認
# マウントポイント配下へのアクセス
$ ls -l /mnt/fsxn/
total 0
-rw-r--r-- 1 root root 13 Dec 11 09:17 nfs-client-1.txt
-rw-r--r-- 1 root root 13 Dec 11 09:23 nfs-client-2.txt

# ファイルの内容出力
$ cat /mnt/fsxn/nfs-client-1.txt
nfs-client-1

# 一度アンマウント
$ sudo umount /mnt/fsxn/

# 再マウント
$ sudo mount -t nfs -o vers=4.1 svm-0c325ec2eef34fc83.fs-0f615ebf79c53ac7d.fsx.us-east-1.amazonaws.com:/unix /mnt/fsxn/
mount.nfs: Operation not permitted

$ sudo mount -t nfs -o vers=4.1 svm-0c325ec2eef34fc83.fs-0f615ebf79c53ac7d.fsx.us-east-1.amazonaws.com:/unix /mnt/fsxn/ -v
mount.nfs: timeout set for Sun Dec 11 09:55:33 2022
mount.nfs: trying text-based options 'vers=4.1,addr=10.0.1.68,clientaddr=10.0.1.6'
mount.nfs: mount(2): Operation not permitted
mount.nfs: Operation not permitted

再マウントしようとするとOperation not permittedで拒否されるようになりました。

NFSの時は上位のジャンクションパスのボリューム,qtreeのエクスポートポリシーで読み取りが許可されているか意識する必要がありますね。

続いてSMBの動作確認です。

# エクスポートポリシーが即座に効いているか確認
# Zドライブ配下の確認
> ls Z:


    Directory: Z:\


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        12/11/2022  12:01 AM             28 domain-user.txt

# ファイルの内容出力
> cat Z:\domain-user.txt
domain-user

# 一度アンマウント
> net use Z: /delete
Z: was deleted successfully.

# 再マウント
> net use Z: \\SVM.CORP.NON-97.NET\share
The command completed successfully.

# Zドライブ配下の確認
> ls Z:


    Directory: Z:\


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        12/11/2022  12:01 AM             28 domain-user.txt

# ファイルの内容出力
> cat Z:\domain-user.txt
domain-user

SMBの場合は上位のジャンクションパスのボリューム,qtreeのエクスポートポリシーの影響を受けないようですね。

なお、ルートボリュームのファイル共有c$をマウントしようとするとちゃんと拒否されるので、ルートボリュームへの読み取りを拒否するというエクスポートポリシーはちゃんとは効いています。

# 一度アンマウント
> net use Z: /delete
Z: was deleted successfully.

# ルートボリュームのファイル共有 c$ をZドライブにマウント
> net use Z: \\SVM.CORP.NON-97.NET\c$
The password is invalid for \\SVM.CORP.NON-97.NET\c$.

Enter the user name for 'SVM.CORP.NON-97.NET': CORP\Administrator
Enter the password for SVM.CORP.NON-97.NET:
System error 5 has occurred.

Access is denied.

ACLで表現しづらい部分はエクスポートポリシーで表現しよう

Amazon FSx for NetApp ONTAPのエクスポートポリシーでボリュームにアクセスできるクライアントを制御してみました。

IPアドレスや認証に使用したプロトコルなどACLで表現できないものについては、エクスポートポリシーで表現することでカバーできそうです。

ただし、エクスポートポリシーの管理者とACLの管理者が異なる場合、「設定したはずなのにアクセスできない...」のように思わぬ挙動が発生すると予想されます。エクスポートポリシーでどのような制御をしているのかは共有しておくと良いでしょう。

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

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