0
0

Cloudflare Zero Trust で Client certificate のデバイスポスチャチェックを試す

Last updated at Posted at 2024-07-20

目的

以下のドキュメントにある手順を確認します。

また、証明書の作成にあたり、以下の記事も参考にして進めます。

Root CA の作成

ca-csr.jsonca-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.csrca.pemca-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.csrclient-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.keychainsudo で証明書をインポートします。

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 に入力して、以下のように設定します。

image.png

確認

macOS の WARP クライアントでは以下のようにデバイスポスチャを確認できます。

image.png

Windows

Client Certificate の登録

以下の手順で登録します。

macOS Client Certificate の登録 と同じ手順で client.p12 ファイルの作成が必要です。

User trust store

以下から証明書のインポートウィザードを起動し、client.p12 ファイルをインポートします。

image.png

以下のコマンドで結果得られれば、問題なく登録されたことが確認できます。

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 ファイルをインポートします。

image.png

以下のコマンドで結果得られれば、問題なく登録されたことが確認できます。

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 storeUser trust store を選択できます。

image.png

確認

Windows の WARP クライアントでは以下のようにデバイスポスチャを確認できます。

image.png

ログ確認

Device posture logs では SUCCESS のログが確認できます。

image.png

以下は Logpush によるログのサンプルです。

logpush.json
{
  "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 認証に加えて、クライアント証明書がデバイスにインストールされているかどうかのデバイスポスチャチェックを追加して、アプリケーションへのアクセスを制御できます。

image.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0