はじめに
こんにちわ、セキュリティチームのむろです。
今回はNetskopeのTamperproof(改ざん防止)「Protect Client configuration and resources」設定が有効な状態で各CLIツールへNetskopeの証明書設定を行おうとするとうまく設定が行えない事例と回避策をご紹介します。
- CLIツールによってはNetskopeの証明書を指定設定して利用する必要がある
- 上記の対応には
C:¥ProgramData¥netskope
へアクセスする必要がある
- 上記の対応には
- しかし、Netskopeの改ざん防止機能の1つである「Protect Client configuration and resources」設定が有効だと
C:¥ProgramData¥netskope
へアクセス制限されてしまうため、証明書設定の対応がうまく動作しない- 「Protect Client configuration and resources」設定自体はNetskopeのプロセス停止の防止、ファイル、レジストリ改ざんの防止のために有効化したいユースケースは存在する
- この組み合わせで回避策を検証してみたのでご紹介します
ちなみに「Protect Client configuration and resources」設定はWindows 10以降の環境のみ動作します。
本ブログの内容は、2023年8月30日時点までの情報を元に作成しておりますが、クラウドサービスの仕様変更等に伴い、将来的に状況が変化することがございます。当社側で仕様変更が確認できた場合は可能な限り修正をしますが、最新の情報を常に維持することは難しい点についてはご了承ください。
前提知識:CLIツールへNetskope証明書の設定が必要
NetskopeはHTTP、HTTPS通信を制御するためブラウザからの通信を制御するイメージが強いかもしれませんが、ブラウザ以外からHTTP通信を行うものが存在します。
例としては以下のようなツールが挙げられます。
- AWS CLI
- Azure CLI
- Git CLI
- curl
実際にこららのツールを利用しており、かつNetskopeをご利用中の方はすでにご存知かもしれませんが、ツールによってはNetskope Clientが有効な状態だと証明書エラーが発生し、以下の例のように通信できない状態になってしまいます。
c:¥test>aws ec2 describe-vpcs
SSL validation failed for https://ec2.us-east-1.amazonaws.com/ [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1129)
c:¥test>
この状態を回避するためにCERTIFICATE PINNED APPSによる除外(Exception)するのも1つの手段ではありますが、Netskopeから除外するため該当の通信はNetskopeの制御・可視化対象から外れてしまいます。
除外ではなく、証明書エラーを解消するためにはCLIツール側でNetskopeの証明書(を含む)、pemファイルをCLIツール側の設定で指定することで回避することができます。
と、前置きが長くなりましたが、以下の公式ドキュメントに詳細が記載されています。
ドキュメント記載の通りですが、パターンとしては大きく2つ+その他です。
パターン1)Netskopeがインストールされたフォルダ内に保管されているNetskope証明書を利用する
- Netskope ClientがDisable状態の場合は逆に証明書エラーとなります
パターン2)端末内の証明書ストア(Netskope証明書が含まれてる)を統合させたCombined Certificate Bundleをシェルで作成して利用する
- Netskope Clientの状態に関わらず証明書エラーは発生しません
その他)AWS CLI向けのバッチファイルで生成した証明書を利用する
- 該当バッチファイルの入手はNetskope Supportサイト内へアクセスできる必要があります
- このAWS CLI向けのバッチファイルが個別に存在するものの、前述のパターン1)及びパターン2)の対応方法でも回避可能です
前提知識:「Protect Client configuration and resources」ってなに?
NetskopeのClient Configuration内の「Protect Client configuration and resources」はNetskopeのプロセスの停止を防いだり、フォルダ、ファイル、レジストリキーを改ざんできないように保護する機能です。
Protect Client configuration and resources: After you select this option, users with elevated permissions are prevented from altering any sub-part (files, folders, and process) of the Netskope Client installation. It prevents users from modifying, renaming, or deleting Netskope processes, folders, files, and registry keys.
OSの管理者権限を持ったユーザーであってもプロセス、フォルダ、ファイル、レジストリキーへの操作は制限され、保護された状態になります。
例えば、C:¥ProgramData¥netskope
フォルダへのアクセスも以下のように不可になります。
「CLIツール向け証明書の設定」と「改ざん防止機能」を組み合わせるとどうなるか
先ほどの例のように前提として「Protect Client configuration and resources」が有効な場合C:¥ProgramData¥netskope
へのアクセスが制限されます
そして、冒頭のCLI向けのNetskope証明書を設定するパターンでは以下のように影響を受けます。
パターン1)Netskopeがインストールされたフォルダ内に保管されているNetskope証明書を利用する
C:¥ProgramData¥netskope
フォルダ内の証明書を参照するため、参照時にエラーとなってしまいます。
c:\test>set AWS_CA_BUNDLE=%ProgramData%NetskopeSTAgentdatanscacert.pem
c:\test>aws ec2 describe-vpcs
SSL validation failed for https://ec2.us-east-1.amazonaws.com/ [Errno 2] No such file or directory
c:\test>
パターン2)端末内の証明書ストア(Netskope証明書が含まれてる)を統合させた証明書(Combined Certificate Bundle)をシェルで作成して利用する
- 証明書を生成するPowerShellがCombined Certificate Bundleのpemファイルの出力先を
C:¥ProgramData¥netskope
へ指定しているため、シェル実行時にエラーとなってしまいます。
PS C:\test> .\netskope_create_combined_cert_v1.ps1
Out-File : パス 'C:\ProgramData\Netskope\STAgent\data\nscacert_combined.pem' へのアクセスが拒否されました。
発生場所 C:\test\netskope_create_combined_cert_v1.ps1:5 文字:3
+ | Out-File -Encoding ascii "$env:ProgramData\Netskope\STAgent\data\ns ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : OpenError: (:) [Out-File], UnauthorizedAccessException
+ FullyQualifiedErrorId : FileOpenFailure,Microsoft.PowerShell.Commands.OutFileCommand
PS C:\test>
- この内容についてはConfiguring CLI-based Tools and Development Frameworks to work with Netskope SSL Interception内に以下のように記述が最近、追記されていました。
Note
The Windows (Powershell) script doesn’t work if the Protect Client configuration and resources option is enabled in the Netskope Client Configuration.
その他)AWS CLI向けのバッチファイルで生成した証明書を利用する
- 証明書を生成するバッチファイルが
C:¥ProgramData¥netskope
フォルダ内の証明書を参照するため、バッチが処理される途中で終了してしまいます。エラーも表示されません。
c:¥test>ns_certbundle_aws_cli_v2.bat
Trying to check if certs exist
c:¥test>
回避策:Combined Certificate Bundleの出力先を変更する
パターン1)、その他)の場合は参照元がアクセス不可となるため対応は難しいですが、パターン2)においては単純に出力先をPowerShell内で書き換えてあげれば回避策になります。
以下はドキュメント内のPowerShell内のOut-Fileで指定しているパスを変更しただけですが、サンプルとして記載します。
((((gci Cert:CurrentUser\Root) + (gci Cert:LocalMachine\Root) + (gci Cert:CurrentUser\CA) + (gci Cert:LocalMachine\Root)) | Where-Object { $_.RawData -ne $null } `
| Sort-Object -Property Thumbprint -Unique `
| % { "-----BEGIN CERTIFICATE-----", [System.Convert]::ToBase64String($_.RawData, "InsertLineBreaks"), "-----END CERTIFICATE-----", "" }) `
-replace "`r","") -join "`n" `
| Out-File -Encoding ascii "C:\test\nscacert_combined.pem" -NoNewline
おまけ:CLI側でCombined Certificate Bundleを設定する
Configuring CLI-based Tools and Development Frameworks to work with Netskope SSL Interceptionにも説明があるように作成した証明書をCLI側の設定で指定します。
例えば、サンプルのPowerShellのパスでAWS CLIの環境変数「AWS_CA_BUNDLE」を利用して設定する場合は以下のように指定します。
c:¥test>set AWS_CA_BUNDLE=C:¥test¥nscacert_combined.pem
なお、AWS CLIの証明書を指定する方法は
- コマンドラインのオプション指定
- プロファイルへの設定
- 環境変数
と3つ存在し、それぞれ優先度が存在します。
–ca-bundle <string>
SSL 証明書の検証時に使用する証明機関 (CA) 証明書バンドルを指定します。 定義されている場合、このオプションはプロファイル設定 ca_bundle の値および AWS_CA_BUNDLE 環境変数よりも優先されます。
CLIツールによって証明書の指定方法は異なりますので、Configuring CLI-based Tools and Development Frameworks to work with Netskope SSL InterceptionやCLI側のドキュメントも参考に設定してみてください。
なお、Git CLIはConfiguring CLI-based Tools and Development Frameworks to work with Netskope SSL Interceptionでは環境変数GIT_SSL_CAPATHへ設定する旨が記載されていますが、 検証した結果ではGIT_SSL_CAPATHでは証明書エラーは解消せず、環境変数「GIT_SSL_CAINFO」への設定が必要である事を確認しています。
うまく動作しない方はお試しください。
おまけ:一時的に「Protect Client configuration and resources」をオフにする
一時的に「Protect Client configuration and resources」をオフにして、その間にAWS CLI向けのバッチファイルを実行するという方法もその他)パターンでは回避策にはなりますが、少し運用上の負荷が高い対応に思えます。
また、そもそもがその他)パターンのAWS CLI向けのバッチファイルでなくてもパターン2)のCombined Certificate BundleでAWS CLIへの対応が可能なため、その他)パターンを利用する動機はあまり無いように思います。
おわりに
特定の条件で発生する事例ではあるものの「Protect Client configuration and resources」によってC:¥ProgramData¥netskope
へのアクセスが制限される前提を認識していないとなかなか解決できなかった事例だったためブログ化してみました。
該当の条件の方にお役に立つと幸いです。