Amazon FSx for NetApp ONTAPのKerberosを利用した転送時の暗号化設定を試してみた

2022.10.16

以下の公式ドキュメントでSMB を使用した転送中のデータの暗号化のやり方は書いてありますが、Kerberosを利用したNFSマウント時の暗号化方法はONTAPの公式ドキュメントを案内されているだけだったので調べながらやってみました。
以下のAWSのドキュメントが転送中のデータの暗号化について記載されているものになります。
転送中のデータの暗号化

構成図

簡単な構成図ですが以下の環境を作成しました。

ADの設定とONTAPをADへ参加させる設定は以下のブログと同じ手順で設定しました。
FSxのファイル仮想マシン名、ストレージ仮想マシン名は短めにしたかったので変更しました。
ファイル仮想マシン名:fsx_test
ストレージ仮想マシン名:fsx_test_svm


LIFでKerberosを有効化する

以下のONTAPのドキュメントを参考にLIFでKerberosを有効化します。
NFS での Kerberos 使用によるセキュリティ強化の概要
Amazon Linux2のEC2からONTAPに以下のコマンドで接続します。
管理エンドポイントは作成したファイルシステムの画面のエンドポイントのところで確認ができます。
パスワードは作成時に設定したfsxadminのパスワードを入力してください。

sudo su -
ssh fsxadmin@管理エンドポイント

接続ができたら以下のコマンドを実行します。
FSx作成時はNFSユーザがいないので以下のコマンドの中で作成しています。
暗号化タイプはAES-256を設定します。

vserver services name-service unix-user create -vserver fsx_test_svm -user NFS -id 500 -primary-gid 0
vserver nfs kerberos realm create -vserver fsx_test_svm -realm FSX-DEV.CLASSMETHOD.JP -adserver-name FSX-DEV -adserver-ip WindowsサーバのIP -clock-skew 300 -kdc-ip WindowsサーバのIP -kdc-port 88 -kdc-vendor Microsoft -comment "Microsoft Kerberos config"
vserver nfs modify -vserver fsx_test_svm -permitted-enc-types AES-256
vserver nfs kerberos interface enable -lif nfs_smb_management_1 -spn nfs/nfs_smb.fsx-dev.classmethod.jp@FSX-DEV.CLASSMETHOD.JP -ou "ou=FSxForNetAppONTAP"
vserver name-mapping create -direction krb-unix -position 1 -pattern "(.+)@FSX-DEV.CLASSMETHOD.JP" -replacement root

4行目のコマンドを実行するとユーザ名とパスワードが求められるのでサービスアカウント (FSxServiceAccount) とパスワードを入力します。
コマンドを実行すると以下のようにFSxForNetAppONTAP内にLIFのコンピュータが追加されます。

LinuxをADに参加させる

Amazon Linux2のAD参加は以下のドキュメントを参考にしています。
Linux インスタンスを手動で結合する
EC2に接続して以下のコマンドを実行して必要なものをインストールします。

sudo yum -y install sssd realmd krb5-workstation samba-common-tools

ADサーバのドメインを検索できるようにします。

sudo sed s/^search/#search/ -i /etc/resolv.conf
sudo sed s/^nameserver/#nameserver/ -i /etc/resolv.conf
sudo sed -e '$s|$|\nsearch fsx-dev.classmethod.jp|g' -i /etc/resolv.conf
sudo sed -e '$s|$|\nnameserver WindowsサーバのIP|g' -i /etc/resolv.conf
sudo realm discover fsx-dev.classmethod.jp

検索できるようになると以下のような結果が返ってきます。

fsx-dev.classmethod.jp
  type: kerberos
  realm-name: FSX-DEV.CLASSMETHOD.JP
  domain-name: fsx-dev.classmethod.jp
  configured: no
  server-software: active-directory
  client-software: sssd
  required-package: oddjob
  required-package: oddjob-mkhomedir
  required-package: sssd
  required-package: adcli
  required-package: samba-common-tools

ADに参加するコマンドを実行します。
実行するとパスワードを求められるのでADユーザ (FSxAdmin) のパスワードを入力します。

sudo realm join -U FSxAdmin@fsx-dev.classmethod.jp fsx-dev.classmethod.jp --verbose

参加に成功するとidコマンドでADユーザのUIDなどが見れるようになります。

id FSxAdmin@fsx-dev.classmethod.jp

AD側の設定

LIFのコンピュータ「NFS-NFS_SMB-FSX」を「Windows Authorization Access Group」に所属させる

FSxForNetAppONTAP内にいるNFS-NFS_SMB-FSXを右クリックしてグループに追加をクリックします。

オブジェクト名にWindows Authorization Access Groupを入力してOKをクリックします。

「NFS-NFS_SMB-FSX」にSPNを追加する

FSxForNetAppONTAP内にいるNFS-NFS_SMB-FSXを右クリックしてプロパティを開きます。
プロパティを開いたら属性エディターを選択してservicePrincipalNameを編集します。

追加する値に以下の値を入力してください。 ファイルシステムIDのアルファベットはすべて大文字にしてください。
1つ目:krbtgt/ファイルシステムID.FSX.AP-NORTHEAST-1.AMAZONAWS.COM
2つ目:nfs/FSxのNFS DNS名
こちらの設定を入れないとマウント時にaccess deniedで失敗します。
入力すると以下のように2つ値が追加されます。

Kerberos認証で許可する暗号化の種類を設定する

gpmc.mscを検索して開きます。

開いたら「フォレスト:fsx-dev.classmethod.jp」→「ドメイン」→「fsx-dev.classmethod.jp」→「Default Domain Policy」を右クリックして編集をクリックします。
クリックするとグループポリシー管理エディタが開きます。
開いたら「コンピューターの構成」→「ポリシー」→「Windowsの設定」→「セキュリティの設定」→「ローカルポリシー」→「セキュリティオプション」をクリックします。
クリックしたらポリシーの一覧が表示されるので、「ネットワークセキュリティ:Kerberosで許可する暗号化の種類を構成する」を右クリックしてプロパティを開きます。
開いたら「これらのポリシーの設定を定義する」にチェックを入れ「AES256_HMAC_SHA1」にチェックを入れてOKをクリックします。

NFSでマウントしてみる

Amazon LinuxのEC2でマウントポイントを作成してからmountコマンドを実行します。
FSxのNFS DNS名はストレージ仮想マシンのエンドポイントから確認できます。

sudo su -
systemctl enable nfs-secure.service && systemctl start nfs-secure.service
kinit FSxAdmin@FSX-DEV.CLASSMETHOD.JP
mkdir /fsx
mount -t nfs -o sec=krb5 FSxのNFS DNS名:/ /fsx

kinitコマンドでFSxAdminのチケットをを取得してからマウントを行います。
マウントが成功したら以下のコマンドでFSxAdminにユーザを変更してディレクトリにファイルを作成してみます。

su FSxAdmin@FSX-DEV.CLASSMETHOD.JP
kinit FSxAdmin@FSX-DEV.CLASSMETHOD.JP
cd /fsx/vol1
touch test
rm test

問題無くディレクトリアクセス、ファイル作成、ファイル削除が行えることを確認できます。

ハマったところ

検証時にLIFのコンピュータに以下のSPNを追加していなかったためマウント時にaccess deniedで失敗していました。
1つ目:krbtgt/ファイルシステムID.FSX.AP-NORTHEAST-1.AMAZONAWS.COM
2つ目:nfs/FSxのNFS DNS名
原因究明のためにマウント時にtcpdumpでパケットキャプチャを取得したところ以下のエラーが出ていたため気が付くことができました。

error-code: eRR-S-PRINCIPAL-UNKNOWN (7)

上記以外にもONTAP側でネームマッピングの設定というものが必要らしく、以下のコマンドを実行して解決しました。
ネームマッピングの仕組み

vserver name-mapping create -direction krb-unix -position 1 -pattern "(.+)@FSX-DEV.CLASSMETHOD.JP" -replacement root

パフォーマンスの確認

普通にnfsでマウントした場合と暗号化した場合のパフォーマンスを確認しました。
ONTAPでは以下のセキュリティ方式が利用できるのでそれぞれ設定してみます。
NFS での Kerberos 使用によるセキュリティ強化の概要

krb5 (Kerberos v5 プロトコル )
krb5i (チェックサムを使用した整合性チェックを備えた Kerberos v5 プロトコル)
krb5p ( Kerberos v5 プロトコルにプライバシーサービスを加えたバージョン)

暗号化無でマウント

以下のコマンドでマウントを行います。

mount -t nfs FSxのNFS DNS名:/ /fsx

パフォーマンス確認にはddコマンドを使用しました。

dd if=/dev/zero of=/fsx/vol1/tmp.txt ibs=1M obs=1M count=900

結果は以下のようになりました。
スループットとしては平均して153 MB/s出ています。

回数 結果
1回目 900+0 records in
900+0 records out
943718400 bytes (944 MB) copied, 6.21035 s, 152 MB/s
2回目 900+0 records in
900+0 records out
943718400 bytes (944 MB) copied, 6.18504 s, 153 MB/s
3回目 900+0 records in
900+0 records out
943718400 bytes (944 MB) copied, 6.11076 s, 154 MB/s

krb5でマウント

以下のコマンドでマウントを行います。

mount -t nfs -o sec=krb5 FSxのNFS DNS名:/ /fsx

パフォーマンス確認コマンドは暗号化無でマウントしたときと同じコマンドで行っています。
結果は以下のようになりました。
スループットとしては平均して157 MB/s出ています。

回数 結果
1回目 900+0 records in
900+0 records out
943718400 bytes (944 MB) copied, 6.3043 s, 150 MB/s
2回目 900+0 records in
900+0 records out
943718400 bytes (944 MB) copied, 5.94663 s, 159 MB/s
3回目 900+0 records in
900+0 records out
943718400 bytes (944 MB) copied, 5.8327 s, 162 MB/s

krb5iでマウント

以下のコマンドでマウントを行います。

mount -t nfs -o sec=krb5i FSxのNFS DNS名:/ /fsx

結果は以下のようになりました。
スループットとしては平均して151 MB/s出ています。

回数 結果
1回目 900+0 records in
900+0 records out
943718400 bytes (944 MB) copied, 6.14557 s, 154 MB/s
2回目 900+0 records in
900+0 records out
943718400 bytes (944 MB) copied, 6.30562 s, 150 MB/s
3回目 900+0 records in
900+0 records out
943718400 bytes (944 MB) copied, 6.34854 s, 149 MB/s

krb5pでマウント

以下のコマンドでマウントを行います。

mount -t nfs -o sec=krb5p FSxのNFS DNS名:/ /fsx

結果は以下のようになりました。
スループットとしては平均して97 MB/s出ています。

回数 結果
1回目 900+0 records in
900+0 records out
943718400 bytes (944 MB) copied, 10.9311 s, 86.3 MB/s
2回目 900+0 records in
900+0 records out
943718400 bytes (944 MB) copied, 8.98025 s, 105 MB/s
3回目 900+0 records in
900+0 records out
943718400 bytes (944 MB) copied, 9.44932 s, 99.9 MB/s

さいごに

SMB を使用した転送中のデータの暗号化に比べると設定することも多く検証するのが少し大変でした。
利用してみた感想ですが、パフォーマンスに影響がでるものもあるので実際に利用する際は注意が必要だと思いました。