マルチプロトコルアクセスを実装したいけどActive Directoryがないぞ
こんにちは、のんピ(@non____97)です。
皆さんはActive Directory(以降AD)やLDAPがない環境において、Aamzon FSx for NetApp ONTAP(以降FSxN)のマルチプロトコルアクセスを行いたいなと思ったことはありますか? 私はあります。
以前、以下記事でFSxN上の同じファイルに対してNFSとSMBの複数のプロトコルでアクセスできることを紹介しました。
マルチプロトコルアクセスを実現する際はユーザーマッピングが必要となります。
上述の記事ではNFSクライアントのLinuxマシンをドメイン参加し、ADユーザーにネームマッピングさせてNTFS ACLが効くことを確認しました。
ネームマッピングについては以下NetApp公式ドキュメントやKBに詳細に書かれています。
それでは、ADやLDAPが存在しない場合はマルチプロトコルアクセスは実装できないのでしょうか。
そんなことはなく、手動でネームマッピングを行えば対応可能です。NetApp公式ドキュメントのマルチプロトコルの設定ワークフローにもConfigure LDAP, if necessary
と必要があればと記載あありました。
抜粋 : マルチプロトコルの設定ワークフロー
実際にADを使わずにマルチプロトコルアクセスの設定をやってみたので紹介します。
いきなりまとめ
- ADやLDAPを使わずともNFSとSMBのマルチプロトコルアクセスは実現できる
- ネームマッピングを使って、アクセスしてきたユーザーのIDをセキュリティスタイルで設定した形式のユーザーに関連づける
- UNIXローカルユーザーやSMBローカルユーザーをFSxN上で作成する必要がある
- NFSv4でマウントする場合はrootユーザーのネームマッピングが必要
検証環境
検証環境は以下の通りです。
Amazon Linux 2023からはNFSで、Windows Server 2022からはSMBでFSxN上のボリュームをマウントします。
FSxNは以下の通り作成しました。NFSv4 ACLでファイルへのアクセス許可をしている事例をあまり見たことがないので、ボリュームのセキュリティスタイルは全てNTFSにして、NTFS ACLでアクセス許可をするようにします。
やってみた
SMBサーバーの作成
それではSMBで接続できるように、SMBサーバーを作成します。
ONTAP CLIでFSxNに接続して、smb-server
というSMBサーバーを作成します。作成するSMBサーバーはドメインに参加させない = ワークグループです。
::> cifs create -vserver svm -cifs-server smb-server -workgroup WORKGROUP
Notice: SMB1 protocol version is obsolete and considered insecure. Therefore it is deprecated and disabled on this CIFS server. Support for SMB1 might be
removed in a future release. If required, use the (privilege: advanced) "vserver cifs options modify -vserver svm -smb1-enabled true" to enable it.
::> cifs show
Server Status Domain/Workgroup Authentication
Vserver Name Admin Name Style
----------- --------------- --------- ---------------- --------------
svm SMB-SERVER up WORKGROUP workgroup
share
というファイル共有を作成します。
::> cifs share create -vserver svm -share-name share -path /vol1
::> cifs share show
Vserver Share Path Properties Comment ACL
-------------- ------------- ----------------- ---------- -------- -----------
svm c$ / oplocks - BUILTIN\Administrators / Full Control
browsable
changenotify
show-previous-versions
svm ipc$ / browsable - -
svm share /vol1 oplocks - Everyone / Full Control
browsable
changenotify
show-previous-versions
作成したファイル共有のACLはEveryoneでFull Controlになっていますね。
SMBローカルユーザーの作成
SMBでアクセスする際に使用するローカルユーザーsmb-user
を作成します。
::> cifs users-and-groups local-user create -vserver svm -user-name smb-user -is-account-disabled false
Enter the password:
Confirm the password:
::> cifs users-and-groups local-user show
Vserver User Name Full Name Description
------------ --------------------------- -------------------- -------------
svm SMB-SERVER\Administrator Built-in administrator account
svm SMB-SERVER\smb-user - -
2 entries were displayed.
ファイル共有のパス/vol1
のDACLを確認します。
::> vserver security file-directory show -vserver svm -path /vol1
Vserver: svm
File Path: /vol1
File Inode Number: 64
Security Style: ntfs
Effective Style: ntfs
DOS Attributes: 10
DOS Attributes in Text: ----D---
Expanded Dos Attributes: -
UNIX User Id: 0
UNIX Group Id: 0
UNIX Mode Bits: 777
UNIX Mode Bits in Text: rwxrwxrwx
ACLs: NTFS Security Descriptor
Control:0x8004
Owner:BUILTIN\Administrators
Group:BUILTIN\Administrators
DACL - ACEs
ALLOW-Everyone-0x1f01ff
ALLOW-Everyone-0x10000000-OI|CI|IO
こちらもEveryoneで許可されているようです。
UNIXのuidやgidは0で、モードビットは777です。NFSで接続できるのでしょうか。
SMBで接続できるか確認
SMBで接続できるか確認します。
> net use Z: \\svm-0812f060a936b7661.fs-08ab94040e16d1cc2.fsx.us-east-1.amazonaws.com\share
The password is invalid for \\svm-0812f060a936b7661.fs-08ab94040e16d1cc2.fsx.us-east-1.amazonaws.com\share.
Enter the user name for 'svm-0812f060a936b7661.fs-08ab94040e16d1cc2.fsx.us-east-1.amazonaws.com': SMB-SERVER\smb-user
Enter the password for svm-0812f060a936b7661.fs-08ab94040e16d1cc2.fsx.us-east-1.amazonaws.com:
The command completed successfully.
> Get-PSDrive -PSProvider FileSystem
Name Used (GB) Free (GB) Provider Root CurrentLocation
---- --------- --------- -------- ---- ---------------
C 15.99 14.00 FileSystem C:\ Users\Administrator
Z 0.00 0.95 FileSystem \\svm-0812f060a936b7661.fs-08ab9...
Zドライブにマウントできました。
Zドライブ配下の表示や書き込みができるか確認します。
> dir Z:\
> echo test > Z:\test.txt
> dir Z:\
Directory: Z:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 9/26/2023 12:06 AM 14 test.txt
> cat Z:\test.txt
test
問題なくできますね。
NFSで接続できるか確認
NFSで接続できるか確認します。
$ sudo mkdir -p /mnt/fsxn/vol1
$ sudo mount -t nfs svm-0812f060a936b7661.fs-08ab94040e16d1cc2.fsx.us-east-1.amazonaws.com:/vol1 /mnt/fsxn/vol1
Created symlink /run/systemd/system/remote-fs.target.wants/rpc-statd.service → /usr/lib/systemd/system/rpc-statd.service.
$ df -hT
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs tmpfs 204M 0 204M 0% /dev/shm
tmpfs tmpfs 82M 452K 82M 1% /run
/dev/nvme0n1p1 xfs 8.0G 1.6G 6.5G 20% /
tmpfs tmpfs 204M 0 204M 0% /tmp
/dev/nvme0n1p128 vfat 10M 1.3M 8.7M 13% /boot/efi
tmpfs tmpfs 41M 0 41M 0% /run/user/0
svm-0812f060a936b7661.fs-08ab94040e16d1cc2.fsx.us-east-1.amazonaws.com:/vol1 nfs 973M 320K 973M 1% /mnt/fsxn/vol1
マウントできました。ただし、NFSv4ではなく、NFSv3のようですね。
明示的にNFSv4を指定してマウントします。
$ sudo umount /mnt/fsxn/vol1
$ sudo mount -t nfs4 svm-0812f060a936b7661.fs-08ab94040e16d1cc2.fsx.us-east-1.amazonaws.com:/vol1 /mnt/fsxn/vol1
mount.nfs4: access denied by server while mounting svm-0812f060a936b7661.fs-08ab94040e16d1cc2.fsx.us-east-1.amazonaws.com:/vol1
NFSv4によるマウントは弾かれてしまいます。
もちろん、FSxN側でNFSv4は有効になっています。
::> nfs show
Vserver: svm
General Access: true
v3: enabled
v4.0: enabled
4.1: enabled
UDP: enabled
TCP: enabled
RDMA: enabled
Default Windows User: -
Default Windows Group: -
早速暗雲が立ち込めてきました。
NFSv3ではマウントできるので、マウントポイント配下を参照できるか確認してみます。
$ sudo mount -t nfs svm-0812f060a936b7661.fs-08ab94040e16d1cc2.fsx.us-east-1.amazonaws.com:/vol1 /mnt/fsxn/vol1
$ df -hT -t nfs
Filesystem Type Size Used Avail Use% Mounted on
svm-0812f060a936b7661.fs-08ab94040e16d1cc2.fsx.us-east-1.amazonaws.com:/vol1 nfs 973M 320K 973M 1% /mnt/fsxn/vol1
$ ls -l /mnt/fsxn/vol1
ls: cannot open directory '/mnt/fsxn/vol1': Permission denied
$ sudo ls -l /mnt/fsxn/vol1
ls: cannot open directory '/mnt/fsxn/vol1': Permission denied
$ sudo ls -ld /mnt/fsxn/vol1
drwxrwxrwx. 2 root root 4096 Sep 25 23:03 /mnt/fsxn/vol1
sudo
してもアクセスできませんでした。これはモードビット上では777ですが、セキュリティスタイルをNTLM
にしている関係でNTLM ACLで制御されるためです。
そのため、NTLM ACLで許可されているユーザーにネームマッピングをする必要があります。
ネームマッピング
ネームマッピングをしていきます。
ネームマッピングをする前にFSxN上に存在するUNIXユーザーとグループ一覧を確認します。
::> name-service unix-user show
(vserver services name-service unix-user show)
User User Group Full
Vserver Name ID ID Name
-------------- --------------- ------ ------ --------------------------------
svm nobody 65535 65535
svm pcuser 65534 65534
svm root 0 1
3 entries were displayed.
::> name-service unix-group show
(vserver services name-service unix-group show)
Vserver Name ID
-------------- ------------------- ----------
svm daemon 1
svm nobody 65535
svm pcuser 65534
svm root 0
4 entries were displayed.
こちらに存在するユーザーを使ってネームマッピングを行います。今回はrootを使いましょう。
実際にネームマッピングをします。先述の記事ではADユーザーにマッピングするために正規表現を使っていましたが、今回はUNIXのroot
をSMBのSMB-SERVER\\smb-user
に1対1でマッピングさせます。
::> name-mapping show
(vserver name-mapping show)
This table is currently empty.
::> name-mapping create -vserver svm -direction unix-win -position 1 -pattern root -replacement SMB-SERVER\\smb-user
(vserver name-mapping create)
::> name-mapping show
(vserver name-mapping show)
Vserver: svm
Direction: unix-win
Position Hostname IP Address/Mask
-------- ---------------- ----------------
1 - - Pattern: root
Replacement: SMB-SERVER\\smb-user
::> name-mapping show -instance
(vserver name-mapping show)
Vserver: svm
Direction: unix-win
Position: 1
Pattern: root
Replacement: SMB-SERVER\\smb-user
IP Address with Subnet Mask: -
Hostname: -
ネームマッピングできました。必要に応じてIPアドレスやホスト名でネームマッピング対象を制限すると良いでしょう。
NFSで接続できるか確認 (2回目)
ネームマッピング後にNFSで接続できるか再度確認します。
$ sudo ls -l /mnt/fsxn/vol1
total 0
-rwxrwxrwx. 1 nobody nobody 14 Sep 26 00:06 test.txt
$ sudo cat /mnt/fsxn/vol1/test.txt
��test
$ whoami
ec2-user
$ ls -l /mnt/fsxn/vol1
ls: cannot open directory '/mnt/fsxn/vol1': Permission denied
sudo
をしてrootユーザーでアクセスする際はマウントポイント配下のファイルを表示できました。一方で、ネームマッピングをしていないec2-userではファイルの一覧は表示できませんでした。
先頭が文字化けしているのはPowershellのデフォルトの文字コードがUTF-16LEだからです。
rootユーザーで書き込みができるかも確認しておきます。
$ echo test2 | sudo tee /mnt/fsxn/vol1/test2.txt
test2
$ sudo ls -l /mnt/fsxn/vol1/
total 0
-rwxrwxrwx. 1 nobody nobody 14 Sep 26 00:06 test.txt
-rwxrwxrwx. 1 root root 6 Sep 26 00:21 test2.txt
$ sudo cat /mnt/fsxn/vol1/test2.txt
test2
書き込みできました。
NFSクライアントで書き込んだファイルをSMBクライアントから確認します。
> dir Z:\
Directory: Z:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 9/26/2023 12:06 AM 14 test.txt
-a---- 9/26/2023 12:21 AM 6 test2.txt
> cat Z:\test2.txt
test2
問題なく表示できますね。
NFSクライアントで作成したtest2.txt
の所有者を確認すると、ネームマッピング先のSMB-SERVER\smb-user
でした。
rootユーザー以外のユーザーをネームマッピングする
rootユーザー以外のユーザーをネームマッピングしてみましょう。
まず、FSxN上にネームマッピング元のユーザーやグループを作成せずにネームマッピングをして、アクセスできるか確認してみます。
ec2-user
をSMB-SERVER\smb-user
にマッピングします。
FsxId08ab94040e16d1cc2::> name-mapping create -vserver svm -direction unix-win -position 2 -pattern ec2-user -replacement SMB-SERVER\\smb-user
(vserver name-mapping create)
::> name-mapping show
(vserver name-mapping show)
Vserver: svm
Direction: unix-win
Position Hostname IP Address/Mask
-------- ---------------- ----------------
1 - - Pattern: root
Replacement: SMB-SERVER\\smb-user
2 - - Pattern: ec2-user
Replacement: SMB-SERVER\\smb-user
2 entries were displayed.
ec2-userでファイルの参照や書き込みができるか確認します。
$ whoami
ec2-user
$ ls -l /mnt/fsxn/vol1/
total 0
-rwxrwxrwx. 1 nobody nobody 14 Sep 26 00:06 test.txt
-rwxrwxrwx. 1 root root 6 Sep 26 00:21 test2.txt
$ cat /mnt/fsxn/vol1/test.txt
cat: /mnt/fsxn/vol1/test.txt: Permission denied
$ cat /mnt/fsxn/vol1/test2.txt
cat: /mnt/fsxn/vol1/test2.txt: Permission denied
$ echo test3 > /mnt/fsxn/vol1/test3.txt
bash: /mnt/fsxn/vol1/test3.txt: Permission denied
マウントポイント配下の一覧を表示することはできましたが、ファイルの中身を参照したり書き込みはできませんでした。
FSxN上に対応したユーザーが必要そうですね。
FSxN上でec2-userというユーザーとグループを作成します。
::> name-service unix-group create -vserver svm -name ec2-user -id 1000
(vserver services name-service unix-group create)
::> name-service unix-user create -vserver svm -user ec2-user -id 1000 -primary-gid 1000
(vserver services name-service unix-user create)
::> name-service unix-group show
(vserver services name-service unix-group show)
Vserver Name ID
-------------- ------------------- ----------
svm daemon 1
svm ec2-user 1000
svm nobody 65535
svm pcuser 65534
svm root 0
5 entries were displayed.
::> name-service unix-user show
(vserver services name-service unix-user show)
User User Group Full
Vserver Name ID ID Name
-------------- --------------- ------ ------ --------------------------------
svm ec2-user 1000 1000
svm nobody 65535 65535
svm pcuser 65534 65534
svm root 0 1
4 entries were displayed.
作成後、ec2-userでファイルの参照や書き込みができるか確認します
$ cat /mnt/fsxn/vol1/test.txt
��test
$ cat /mnt/fsxn/vol1/test2.txt
test2
$ echo test3 > /mnt/fsxn/vol1/test3.txt
$ ls -l /mnt/fsxn/vol1/
total 0
-rwxrwxrwx. 1 nobody nobody 14 Sep 26 00:06 test.txt
-rwxrwxrwx. 1 root root 6 Sep 26 00:21 test2.txt
-rwxrwxrwx. 1 ec2-user ec2-user 6 Sep 26 00:39 test3.txt
$ cat /mnt/fsxn/vol1/test3.txt
test3
ユーザーやグループ作成前にできなかったファイルの中身の参照や書き込みができるようになりました。
ネームマッピング後はNFSv4でもアクセスできる件
EC2インスタンスの再起動をしたため、再度マウントしようとしたところNFSv4でマウントできていることを確認しました。
$ df -hT -t nfs4
Filesystem Type Size Used Avail Use% Mounted on
svm-0812f060a936b7661.fs-08ab94040e16d1cc2.fsx.us-east-1.amazonaws.com:/vol1 nfs4 973M 320K 973M 1% /mnt/fsxn/vol1
本当にネームマッピングが起因でNFSv4をマウントできるようになったのか確認します。
rootユーザーのネームマッピングを削除します。
::> name-mapping delete -direction unix-win -position 1
(vserver name-mapping delete)
::> name-mapping show
(vserver name-mapping show)
Vserver: svm
Direction: unix-win
Position Hostname IP Address/Mask
-------- ---------------- ----------------
2 - - Pattern: ec2-user
Replacement: SMB-SERVER\\smb-user
NFSでマウントしてみます。
$ sudo mount -t nfs -v svm-0812f060a936b7661.fs-08ab94040e16d1cc2.fsx.us-east-1.amazonaws.com:/vol1 /mnt/fsxn/vol1
mount.nfs: timeout set for Tue Sep 26 04:16:00 2023
mount.nfs: trying text-based options 'vers=4.2,addr=10.0.8.20,clientaddr=10.0.0.21'
mount.nfs: mount(2): Permission denied
mount.nfs: trying text-based options 'vers=4,minorversion=1,addr=10.0.8.20,clientaddr=10.0.0.21'
mount.nfs: mount(2): Permission denied
mount.nfs: trying text-based options 'vers=4,addr=10.0.8.20,clientaddr=10.0.0.21'
mount.nfs: mount(2): Permission denied
mount.nfs: trying text-based options 'addr=10.0.8.20'
mount.nfs: prog 100003, trying vers=3, prot=6
mount.nfs: trying 10.0.8.20 prog 100003 vers 3 prot TCP port 2049
mount.nfs: prog 100005, trying vers=3, prot=17
mount.nfs: trying 10.0.8.20 prog 100005 vers 3 prot UDP port 635
mount.nfs: mount(2): Device or resource busy
mount.nfs: access denied by server while mounting svm-0812f060a936b7661.fs-08ab94040e16d1cc2.fsx.us-east-1.amazonaws.com:/vol1
NFSv4でマウントしようとしたところ失敗して、NFSv3でマウントしたことが分かります。
rootユーザーのネームマッピングを追加します。
::> name-mapping create -vserver svm -direction unix-win -position 1 -pattern root -replacement SMB-SERVER\\smb-user
(vserver name-mapping create)
::> name-mapping show
(vserver name-mapping show)
Vserver: svm
Direction: unix-win
Position Hostname IP Address/Mask
-------- ---------------- ----------------
1 - - Pattern: root
Replacement: SMB-SERVER\\smb-user
2 - - Pattern: ec2-user
Replacement: SMB-SERVER\\smb-user
2 entries were displayed.
NFSv4でマウントできるか確認します。
$ sudo umount /mnt/fsxn/vol1
sh-5.2$ sudo mount -t nfs -v svm-0812f060a936b7661.fs-08ab94040e16d1cc2.fsx.us-east-1.amazonaws.com:/vol1 /mnt/fsxn/vol1
mount.nfs: timeout set for Tue Sep 26 04:20:11 2023
mount.nfs: trying text-based options 'vers=4.2,addr=10.0.8.20,clientaddr=10.0.0.21'
$ df -hT -t nfs4
Filesystem Type Size Used Avail Use% Mounted on
svm-0812f060a936b7661.fs-08ab94040e16d1cc2.fsx.us-east-1.amazonaws.com:/vol1 nfs4 973M 384K 973M 1% /mnt/fsxn/vol1
NFSv4でマウントできました。
NFSv4でマウントする場合は、rootに対するネームマッピングを用意すると良いでしょう。
その場合、いずれのLinuxマシンでもrootユーザーであればマウントできてしまうので、ネームマッピングやエクスポートポリシーでIPアドレスを絞ったり、rootユーザー専用のSMBローカルユーザーを作成してあげてDACLを制御してあげると良いでしょう。
簡単にNFSとSMBのマルチプロトコルアクセスを実現できる
Amazon FSx for NetApp ONTAPにてマルチプロトコルアクセスをActive DirectoryやLDAPを使わずに設定してみました。
ネームマッピングやSMBローカルユーザーを作成・管理する手間はありますが、検証などで取り敢えずNFSとSMBのマルチプロトコルアクセスを実現したいという時に活躍しそうですね。
この記事が誰かの助けになれば幸いです。
以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!