目的
以下のドキュメントにある手順を確認します。
また、証明書の作成にあたり、以下の記事も参考にして進めます。
Root CA の作成
ca-csr.json
と ca-config.json
を準備します。
cat << EOS > ca-csr.json
{
"CN": "khayama",
"hosts": [""],
"key": {
"algo": "ecdsa",
"size": 256
},
"names": [
{
"O": "khayama",
"OU": "Sales",
"L": "Shibuya",
"ST": "Tokyo",
"C": "JP"
}
],
"ca": {
"expiry": "876000h"
}
}
EOS
cat << EOS > ca-config.json
{
"signing": {
"default": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
EOS
以下のコマンドで ca.csr
と ca.pem
と ca-key.pem
を作成します。
cfssl genkey -initca ca-csr.json | cfssljson -bare ca
Root CA のアップロード
以下のコマンドで Root CA をアップロードします。
export EMAIL='YOUR_EMAIL'
export APIKEY='YOUR_APIKEY'
export ACCOUNT_ID='YOUR_ACCOUNT_ID'
export CA_CERT=$(awk -v ORS='\\n' '1' ca.pem)
export CA_KEY=$(awk -v ORS='\\n' '1' ca-key.pem)
curl -s "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/mtls_certificates" \
--header "X-Auth-Email: $EMAIL" \
--header "X-Auth-Key: $APIKEY" \
--header "Content-Type: application/json" \
--data '{
"name": "client_cert_check_ca",
"certificates": "'"$CA_CERT"'",
"private_key": "'"$CA_KEY"'",
"ca": true
}' | jq
その後、result.id
として返ってくる UUID を控えておきます。
export CA_UUID=$(curl -s "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/mtls_certificates" \
--header "X-Auth-Email: $EMAIL" \
--header "X-Auth-Key: $APIKEY" \
--header "Content-Type: application/json" | jq -r '.result[] | select (.name == "client_cert_check_ca") | .id')
echo $CA_UUID
Client Certificate の作成
client.json
を準備します。
cat << EOS > client.json
{
"CN": "khayama",
"hosts": [""],
"key": {
"algo": "ecdsa",
"size": 256
},
"names": [
{
"O": "khayama",
"OU": "Sales",
"L": "Shibuya",
"ST": "Tokyo",
"C": "JP"
}
]
}
EOS
以下のコマンドで client.csr
と client-key.pem
を作成します。
cfssl genkey client.json | cfssljson -bare client
以下のコマンドで client.pem
を作成します。
cfssl sign -ca ca.pem -ca-key ca-key.pem -config ca-config.json client.csr | cfssljson -bare client
macOS
Client Certificate の登録
以下の記事を参考にします。
以下のコマンドで client.p12
を作成します。
openssl pkcs12 -export -legacy \
-in client.pem \
-inkey client-key.pem \
-out client.p12 \
-passout pass:password \
-name "Client Cert for CF ZT Device Posture Check"
/Library/Keychains/System.keychain
に sudo
で証明書をインポートします。
sudo security -v import client.p12 -k /Library/Keychains/System.keychain -P "password"
以下のコマンドで表示が確認できれば、登録完了です。
security find-certificate -c "khayama" -p /Library/Keychains/System.keychain
デバイスポスチャの設定
Root CA のアップロード で控えた UUID を Certificate ID に入力して、以下のように設定します。
確認
macOS の WARP クライアントでは以下のようにデバイスポスチャを確認できます。
Windows
Client Certificate の登録
以下の手順で登録します。
macOS Client Certificate の登録 と同じ手順で client.p12
ファイルの作成が必要です。
User trust store
以下から証明書のインポートウィザードを起動し、client.p12
ファイルをインポートします。
以下のコマンドで結果得られれば、問題なく登録されたことが確認できます。
PS C:\Windows\system32> Get-ChildItem Cert:\CurrentUser\My\ | where{$_.Subject -like "*khayama*"}
PSParentPath: Microsoft.PowerShell.Security\Certificate::CurrentUser\My
Thumbprint Subject
---------- -------
3FDD10D889775FDA11906FAB8EFABC07F03A8F38 CN=khayama, OU=Sales, O=khayama, L=Shibuya, S=Tokyo, C=JP
Local machine trust store
以下から証明書のインポートウィザードを起動し、client.p12
ファイルをインポートします。
以下のコマンドで結果得られれば、問題なく登録されたことが確認できます。
PS C:\Windows\system32> Get-ChildItem Cert:\LocalMachine\My\ | where{$_.Subject -like "*khayama*"}
PSParentPath: Microsoft.PowerShell.Security\Certificate::LocalMachine\My
Thumbprint Subject
---------- -------
3FDD10D889775FDA11906FAB8EFABC07F03A8F38 CN=khayama, OU=Sales, O=khayama, L=Shibuya, S=Tokyo, C=JP
デバイスポスチャの設定
Root CA のアップロード で控えた UUID を Certificate ID に入力して、以下のように設定します。
Windows OS では Local machine trust store
と User trust store
を選択できます。
確認
Windows の WARP クライアントでは以下のようにデバイスポスチャを確認できます。
ログ確認
Device posture logs では SUCCESS
のログが確認できます。
以下は Logpush によるログのサンプルです。
{
"ClientVersion": "2024.6.416",
"DeviceID": "0bd7ef7a-3e5e-11ef-ba25-fa495d0d6c56",
"DeviceManufacturer": "",
"DeviceModel": "Mac15,7",
"DeviceName": "xxx",
"DeviceSerialNumber": "xxx",
"DeviceType": "mac",
"Email": "non_identity@xxx.cloudflareaccess.com",
"OSVersion": "14.5.0",
"PolicyID": "fadeead5-ff81-49de-b943-f93bab1f21ea",
"PostureCheckName": "macOS Client Cert",
"PostureCheckType": "client_certificate_v2",
"PostureEvaluatedResult": true,
"PostureExpectedJSON": {
"certificate_id": "79cf0334-ada9-416f-841a-0f24ec7aefae",
"cn": "khayama",
"check_private_key": true,
"locations": {
"trust_stores": [
"system"
]
}
},
"PostureReceivedJSON": {
"certificate_id": "79cf0334-ada9-416f-841a-0f24ec7aefae",
"exists": true,
"error": null
},
"Timestamp": "2024-07-19T16:39:18Z",
"UserUID": "b7761faf-27e6-4d08-a35a-802db584b739"
}
まとめ
このように設定することで ID 認証に加えて、クライアント証明書がデバイスにインストールされているかどうかのデバイスポスチャチェックを追加して、アプリケーションへのアクセスを制御できます。