ラベル 証明書 の投稿を表示しています。 すべての投稿を表示
ラベル 証明書 の投稿を表示しています。 すべての投稿を表示

2026年8月23日日曜日

Prism Element/Prism Centralのログインを証明書認証にする

昨今は、サイバー攻撃による被害が増えておりセキュリティという側面に目が向けられることが多くなっています。

Nutanixは、仮想マシン、すなわち攻撃者が狙うデータが入っている場所になるため、攻撃者からすると狙うターゲットとして見られることもあります。

ネットワーク面でのセキュリティ対策は言うまでもありませんが、相手は脆弱性をついた裏口の侵入以外に、正攻法で盗んだユーザ名やパスワードで正規のユーザに成りすましてログインし、悪意のある行動を行うことも考えられます。

CVMへのSSHアクセスは、クラスターロックダウンやそのほかBashシェルの廃止など様々な方面で対策がとられております。Prism Centralは、SAMLによるIdPとの連携で二要素認証なども行うことができますが、Prism Elementの画面自体は、ユーザー名・パスワードの認証がデフォルトとなっており、昨今のセキュリティ事情からみると少し弱いようにも見受けられます。

しかし、Prism Element自体は、オペレーションで必要な画面となりますので、無効化することができません。

そのため今日は、Prism Elementのセキュリティ強化として、証明書認証の手法をお伝えします。

まず、この証明書認証にあたって用意いただくのは、WindowsのActive Directory Domain Controllerと証明書サーバーです。

Prismの証明書認証は、証明書のユーザ情報とADのユーザ情報をマッチさせ、ログインの許可を行います。

では、実際の手順をご紹介します。


1.CAの証明書を登録

WindowsのCAからCAの証明書を取得します。Web証明書サービスをインストールしている場合は、「https://CAサーバー/certsrv」から、取得が可能です。


BASE64形式で取得した証明書を、Prism ElementのSettings→Authentication→Clientタブを開き、Clinet Chain Certificateに先ほどダウンロードしたCAのルート証明書をインポートします。


証明書をインポートするPrismサービスが再起動し、Prism Elementへ再ログインが要求されることを確認し、Yesをクリックします。


2.ドメインコントローラーの登録

再度、Prism Elementにログイン後、Settings→Authenticationから「Directory List]タブを開き、「+New Directory」で、ドメインコントローラーを指定します。

以下のようにドメイントローラーを指定します。


ここで注意が必要なこととしては、Windows Server 2025から、LDAPSでの通信のみがデフォルト許可される形となりましたので、Prism ElementであらかじめDNSサーバーをドメインコントローラーの名前引きができる状態にし、こちらのドメインコントローラーの登録時もい、IPアドレスでの入力ではなく、FQDNで指定をすることで、あらかじめインポートしたルート証明書で承認された形で、LDAPSの通信ができるようになります。

※そのため、手順的に先にCAのルート証明書をインポートする作業を先に行っています。


3.ロールの設定

証明書の登録が終わりましたら、Prism Elementにログインできるグループを指定します。

Settings → Role Mappingから、Create Role Mappingで、ここでは、ActiveDrectoryのグループで「野比家」をCluster Adminを指定します。


AD上では、以下のように作成されています。



4.サービスアカウントの登録と証明書認証の有効化

続いて、Settings → Authenticationから「Client」タブを開き再度、証明書設定行います。

「Configure Service Account」をチェックを入れ、APIコール用に利用するユーザをしています。その設定ののち、「Enable Client Authentication」にチェックを入れ、証明書認証を有効化します。


再度、Prismサービスが再起動する旨が表示されますので、Yesをクリックします。
(Primsサービスを再起度しても仮想マシンの動作には影響ありません)



5.証明書認証のみに設定を行う

再度、Prism Elementにログインし、同じく、Settings → Authenticaionから「Clieint」タブを開き、今度は「Enable CAC Authentication」にチェックを入れます。


再度、Prismサービスの再起動が要求されますので、Yesをクリックします。


ブラウザで、Prism Elementを開こうとすると、ドメインに適合した証明書を保持している場合、証明書の確認画面が表示されます。


この後、ログイン画面をスキップし、Prism Elementの画面が表示されます。



ブラウザの証明書確認画面をキャンセルすると、adminユーザのみログインができりるようになりそれ以外のローカルユーザーやActive Directoryのユーザーは、ログインが許可されません。

従来のID/パスワードだけの認証ですと、セキュリティ面での懸念がある場合、証明書認証との組み合わせでご利用いただくことで、セキュリティ強化を行うことができます。

本設定は、Prism Elementだけではなく、Prism Centralでも同様に設定が可能です。


(参考)

KB10894 / CAC Authentication implementation

KB1825 / How to Fix or Disable Incorrect or Misconfigured CAC Authentication Settings

Common Access Card Authentication with Client Chain Certificate in Prism Element







2020年12月17日木曜日

NGTによる仮想マシンの識別方法と証明書の更新方法について

前回は、仮想マシンクローン時の一括仮想マシンへのNGT設定情報アップデートの方法をお伝えしました。
そもそもこのngt_uuidは仮想マシン毎に個別で発行されますが、クローンする前の元の仮想マシンで利用したuuidに対してクローンした仮想マシンではNGTが有効にならない理由については触れていませんでした。もし発行されているuuidという識別だけであれば、クローン元の仮想マシンとクローン先の仮想マシンで同じuuidがngt_config.jsonに書き込まれているので、マスター仮想マシンがシャットダウンされていれば、クローンした仮想マシンでこのuuidは利用可能であると思いますが、実際にはこのクローンした仮想マシンでngtのステータスが有効になることはありません。前回の説明どうりNGTのISOをマウントし設定ファイルを更新する必要があります。

ではどのようにして仮想マシンそれぞれ固有の情報を識別しているかというと、それは仮想マシン毎に発行されるクライアント証明書に秘密があります。

Windowsの場合、ngt_config.jsonが配置されているディレクトリと同じ「C:\Program Files\Nutanix\config」配下に、「client-cert.pem」と「client-key.pem」ファイルがあることが分ります。これが各クライアント毎に生成される秘密鍵と証明書です。この証明書情報とその仮想マシンが疎通するIPアドレスから仮想マシンUUIDが識別され、Nutanix側で持っている仮想マシンUUIDに紐付く情報と一致しているかを見ています。

さてここで勘の良い方は気づいたと思います。

証明書ということは有効期限があります。証明書の有効期限が切れるとNutanixクラスターとNGTの間の疎通はできなくなります。

証明書の有効期限が近づいたら、またNGTのISOをマウントして仮想マシン再起動したらいいんでしょ?と思うかも知れませんが、現行AOS5.18のバージョンにおいては一度仮想マシンに対して証明書が発行されると、その情報が保持されたままとなり、この証明書情報を削除して再度生成するという手順を踏まないと有効期限を持った証明書が生成されません。

今回はこの証明書の更新方法について見ていきます。

わかりやすいように今回はWindows環境におけるNGT証明書の更新方法を紹介いたします。

Linuxなど別のOSや原則証明書更新方法の詳細は、KB:8120を参考にして頂くことをおすすめします。


<現行の証明書の日付の確認>

「C:\Program Files\Nutanix\config」の配下にある、「client-cert.pem」ファイルを確認します。このファイルをファイル名を「client-cert.pem.cer」に変更します。


拡張子を変更した、「clinet-cert,pem.cer」ファイルをダブルクリックすると証明書の日付を確認することが出来ます。


この証明書は、現時点で証明書の日付は切れていませんが、期限切れまで三ヶ月を切っています。今回はこの
確認後は、元のファイル名「client-cert.pem」にファイル名を戻しておきます。

<証明書の更新>

該当の仮想マシンが稼働するNutanixクラスターの任意のCVMにSSHで接続します。

仮想マシンのUUIDをncliを利用して取得します。(acliで取得しても構いませんが、vSphere環境のNutanixクラスターの場合「acli」が利用できませんのでここではncliを利用します。「ncli vm list name="仮想マシン名"」

ncli vm list name="Windows Server 2016 Template"
    Id                        : 00056d28-59d3-7bbc-0000-000000014005::20edafba-0644-4e57-a3cf-4abef2f69a5f
    Uuid                      : 20edafba-0644-4e57-a3cf-4abef2f69a5f  ★
    Name                      : Windows Server 2016 Template
    VM IP Addresses           : 192.168.1.91, 169.254.117.111
    Hypervisor Host Id        : 00056d28-59d3-7bbc-0000-000000014005::1591223829
    Hypervisor Host Uuid      : 92dad1eb-6562-4489-aca2-5e15ca07adc4
    Hypervisor Host Name      : NX-AHV-2
    Memory                    : 4 GiB (4,294,967,296 bytes)
    Virtual CPUs              : 2
    VDisk Count               : 1
    VDisks                    : 00056d28-59d3-7bbc-0000-000000014005::NFS:4:0:313
    Protection Domain         :
    Consistency Group         :
こちらのUUIDを元に、
「nutanix_guest_tools_cli delete_vm_tools_entity <UUID>」コマンドを実行し、証明書データーを削除します。

$nutanix_guest_tools_cli delete_vm_tools_entity 20edafba-0644-4e57-a3cf-4abef2f69a5f
2020-12-12 09:00:59,358Z:24911(0x7fa2ecb59a80):ZOO_INFO@log_env@960: Client environment:zookeeper.version=zookeeper C client 3.4.3
2020-12-12 09:00:59,359Z:24911(0x7fa2ecb59a80):ZOO_INFO@log_env@964: Client environment:host.name=ntnx-17sm6c100126-b-cvm
2020-12-12 09:00:59,359Z:24911(0x7fa2ecb59a80):ZOO_INFO@log_env@971: Client environment:os.name=Linux
2020-12-12 09:00:59,359Z:24911(0x7fa2ecb59a80):ZOO_INFO@log_env@972: Client environment:os.arch=3.10.0-1127.19.1.el7.nutanix.20201004.cvm.x86_64
2020-12-12 09:00:59,359Z:24911(0x7fa2ecb59a80):ZOO_INFO@log_env@973: Client environment:os.version=#1 SMP Sun Oct 4 12:55:45 UTC 2020
2020-12-12 09:00:59,359Z:24911(0x7fa2ecb59a80):ZOO_INFO@zookeeper_init@1008: Initiating client connection, host=zk3:9876,zk2:9876,zk1:9876 sessionTimeout=20000 watcher=0x556be811c6e0 sessionId=0 sessionPasswd=<null> context=0x7ffc5bf9bfc0 flags=0
2020-12-12 09:00:59,361Z:24911(0x7fa2ecace700):ZOO_INFO@zookeeper_interest@1954: Connecting to server 192.168.XX.YY:9876
2020-12-12 09:00:59,361Z:24911(0x7fa2ecace700):ZOO_INFO@zookeeper_interest@1991: Zookeeper handle state changed to ZOO_CONNECTING_STATE for socket [192.168.XX.YY:9876]
2020-12-12 09:00:59,361Z:24911(0x7fa2ecace700):ZOO_INFO@check_events@2191: initiated connection to server [192.168.XX.YY:9876]
2020-12-12 09:00:59,364Z:24911(0x7fa2ecace700):ZOO_INFO@check_events@2239: session establishment complete on server [192.168.XX.YY:9876], sessionId=0x1762179677dcf90, negotiated timeout=20000
2020-12-12 09:00:59,467Z:24911(0x7fa2ecb59a80):ZOO_INFO@zookeeper_close@3104: Closing zookeeper sessionId=0x1762179677dcf90 to [192.168.XX.YY:9876]
result_vec: kNoError

kNoErrorで終わっていれば、削除は無事に終了しています。

続いて、CVM上で「nutanix_guest_tools_cli create_vm_tools_entity <UUID>」コマンドを実行し、新しい証明書を作成します。

$ nutanix_guest_tools_cli create_vm_tools_entity 20edafba-0644-4e57-a3cf-4abef2f69a5f
2020-12-12 09:05:17,306Z:31766(0x7f33f5eaaa80):ZOO_INFO@log_env@960: Client environment:zookeeper.version=zookeeper C client 3.4.3
2020-12-12 09:05:17,306Z:31766(0x7f33f5eaaa80):ZOO_INFO@log_env@964: Client environment:host.name=ntnx-17sm6c100126-b-cvm
2020-12-12 09:05:17,306Z:31766(0x7f33f5eaaa80):ZOO_INFO@log_env@971: Client environment:os.name=Linux
2020-12-12 09:05:17,306Z:31766(0x7f33f5eaaa80):ZOO_INFO@log_env@972: Client environment:os.arch=3.10.0-1127.19.1.el7.nutanix.20201004.cvm.x86_64
2020-12-12 09:05:17,306Z:31766(0x7f33f5eaaa80):ZOO_INFO@log_env@973: Client environment:os.version=#1 SMP Sun Oct 4 12:55:45 UTC 2020
2020-12-12 09:05:17,306Z:31766(0x7f33f5eaaa80):ZOO_INFO@zookeeper_init@1008: Initiating client connection, host=zk3:9876,zk2:9876,zk1:9876 sessionTimeout=20000 watcher=0x565041b156e0 sessionId=0 sessionPasswd=<null> context=0x7fffe016f240 flags=0
2020-12-12 09:05:17,308Z:31766(0x7f33f5e1f700):ZOO_INFO@zookeeper_interest@1954: Connecting to server 192.168.XX.YY:9876
2020-12-12 09:05:17,309Z:31766(0x7f33f5e1f700):ZOO_INFO@zookeeper_interest@1991: Zookeeper handle state changed to ZOO_CONNECTING_STATE for socket [192.168.XX.YY:9876]
2020-12-12 09:05:17,309Z:31766(0x7f33f5e1f700):ZOO_INFO@check_events@2191: initiated connection to server [192.168.XX.YY:9876]
2020-12-12 09:05:17,320Z:31766(0x7f33f5e1f700):ZOO_INFO@check_events@2239: session establishment complete on server [192.168.XX.YY:9876], sessionId=0x1762179677dcf9f, negotiated timeout=20000
2020-12-12 09:05:17,423Z:31766(0x7f33f5eaaa80):ZOO_INFO@zookeeper_close@3104: Closing zookeeper sessionId=0x1762179677dcf9f to [192.168.XX.YY:9876]
result_vec: kNoError

同じくNoErrorで終わっていることを確認します。

続いて、Prism Elementから該当の仮想マシンのNGTのISOをマウントします。


なお、NGTのISOマウントはCVMから
「nutanix_guest_tools_cli mount_guest_tools <uuid> 」
で、マウントさせることも可能です。

「Nutanix Guest Tools Agent」サービスを先どうするか、仮想マシンを再起動します。

再起動後は、証明書の日付が新しくなっているか確認してましょう。
再度、「C:\Program Files\Nutanix\config」の配下にある、「client-cert.pem」ファイルを確認します。このファイルをファイル名を「client-cert.pem.cer」に変更します。

拡張子を変更した、「clinet-cert,pem.cer」ファイルをダブルクリックすると証明書の日付を確認することが出来ます。


変更したファイル名「client-cert.pem.cer」は、「client-cert.pem」に戻しておきましょう。(でないと証明書ファイルが読めずにNGTの疎通が出来なくなります)


あとは、NGTのコミュニケーションがただしく取れているかも確認しておきましょう。

$ ncli ngt get vm-id=20edafba-0644-4e57-a3cf-4abef2f69a5f
    VM Id                     : 00056d28-59d3-7bbc-0000-000000014005::20edafba-0644-4e57-a3cf-4abef2f69a5f
    VM Name                   : Windows Server 2016 Template
    NGT Enabled               : true
    Tools ISO Mounted         : true
    Vss Snapshot              : true
    File Level Restore        : false
    Communication Link Active : true

これで証明書の更新が正常に行い、NGTのコミュニケーションもNutanixクラスターと仮想マシン間で行えていることが分ります。

なお、証明書の有効期限が近づいた場合に何らかのアラートを表示する機能は、AOS5.18点ではまだ実装されていません。

今後のバージョンでこのあたりの仕様は変更になる見込みと聞いておりますので、今の間はNGTの証明書有効期限についてはすこし気に掛けて頂く必要があります。