Azure Kubernetes Service (AKS) ノードへのセキュリティで保護されたアクセスのために SSH を管理する

この記事では、初期デプロイの間に、または後から、AKS クラスターまたはノード プールで SSH キー (プレビュー) を構成する方法について説明します。

AKS では、クラスター ノードで SSH キーを管理するための次の構成オプションがサポートされています。

  • SSH キーを使ってクラスターを作成する
  • 既存の AKS クラスターで SSH キーを更新する
  • SSH サービスを無効にして有効にする

重要

AKS のプレビュー機能は、セルフサービスのオプトイン単位で利用できます。 プレビューは、"現状有姿のまま" および "利用可能な限度" で提供され、サービス レベル アグリーメントおよび限定保証から除外されるものとします。 AKS プレビューは、ベストエフォート ベースでカスタマー サポートによって部分的にカバーされます。 そのため、これらの機能は、運用環境での使用を意図していません。 詳細については、次のサポート記事を参照してください。

開始する前に

  • Update を使うには、aks-preview バージョン 0.5.116 以降が必要です。
  • Disable を使うには、aks-preview バージョン 1.0.0b6 以降が必要です。
  • Create および Update SSH 機能では、既存のクラスター上の Linux、Windows、Azure Linux のノード プールがサポートされています。
  • Disable SSH 機能は、Windows Server オペレーティング システムを実行するノード プール上のこのプレビュー リリースではサポートされていません。

aks-preview Azure CLI 拡張機能をインストールする

  1. az extension add コマンドを使用して aks-preview 拡張機能をインストールします。

    az extension add --name aks-preview
    
  2. az extension update コマンドを使って拡張機能の最新バージョンに更新します。

    az extension update --name aks-preview
    

DisableSSHPreview 機能フラグを登録する

Disable SSH 機能を使うには、次の手順のようにして、サブスクリプションでそれを登録して有効にします。

  1. az feature register コマンドを使用して、DisableSSHPreview 機能フラグを登録します。

    az feature register --namespace "Microsoft.ContainerService" --name "DisableSSHPreview"
    

    状態が [登録済み] と表示されるまでに数分かかります。

  2. az feature show コマンドを使用して、登録の状態を確認します。

    az feature show --namespace "Microsoft.ContainerService" --name "DisableSSHPreview"
    
  3. 状態が Registered と表示されたら、az provider register コマンドを使用して Microsoft.ContainerService リソース プロバイダーの登録を最新の情報に更新します。

    az provider register --namespace Microsoft.ContainerService
    

SSH キーを使用して AKS クラスターを作成する

az aks create コマンドを使用して、SSH 公開キーで AKS クラスターをデプロイします。 --ssh-key-value 引数を使用して、キーまたはキー ファイルを指定できます。

SSH パラメーター 説明 規定値
--generate-ssh-key 独自の SSH キーがない場合は、--generate-ssh-key を指定します。 Azure CLI によって SSH キーのセットが自動的に生成されて、既定のディレクトリ ~/.ssh/ に保存されます。
--ssh-key-value SSH アクセス用にノード VM にインストールする公開キー パスまたはキーの内容。 たとえば、ssh-rsa AAAAB...snip...UcyupgH azureuser@linuxvm のようにします。 ~/.ssh/id_rsa.pub
--no-ssh-key SSH キーが必要ない場合は、この引数を指定します。 ただし、Azure 仮想マシン リソースの依存関係では空の SSH キー ファイルはサポートされていないため、AKS によって SSH キーのセットが自動的に生成されます。 その結果、キーは返されず、ノード VM への SSH 接続には使用できません。 秘密キーは破棄され、保存されません。

Note

パラメーターを指定しないと、Azure CLI は既定で、~/.ssh/id_rsa.pub ファイルに格納されている SSH キーを参照します。 キーが見つからない場合、コマンドは An RSA key file or key value must be supplied to SSH Key Value というメッセージを返します。

このコマンドの例を次に示します。

  • クラスターを作成し、既定で生成された SSH キーを使用するには:

    az aks create --name myAKSCluster --resource-group MyResourceGroup --generate-ssh-key
    
  • SSH 公開キー ファイルを指定するには、--ssh-key-value 引数を含めます。

    az aks create --name myAKSCluster --resource-group MyResourceGroup --ssh-key-value ~/.ssh/id_rsa.pub
    

既存の AKS クラスターで SSH 公開キーを更新する

クラスターで SSH 公開キー (プレビュー) を更新するには、az aks update コマンドを使います。 この操作により、すべてのノード プールでキーが更新されます。 --ssh-key-value 引数を使って、キーまたはキー ファイルを指定できます。

Note

SSH キーの更新は、AKS クラスターを使用した Azure 仮想マシン スケール セットでサポートされています。

このコマンドの例を次に示します。

  • 新しい SSH 公開キー値を指定するには、--ssh-key-value 引数を含めてください:

    az aks update --name myAKSCluster --resource-group MyResourceGroup --ssh-key-value 'ssh-rsa AAAAB3Nza-xxx'
    
  • SSH 公開キー ファイルを指定するには、--ssh-key-value 引数を使って指定します。

    az aks update --name myAKSCluster --resource-group MyResourceGroup --ssh-key-value ~/.ssh/id_rsa.pub
    

重要

SSH キーを更新した後、AKS はノード プールの更新を自動実行しません。 いつでもノード プール更新操作を選んで実行できます。 SSH キーの更新操作は、ノード イメージの更新が完了した後で有効になります。

SSH の無効化の概要

セキュリティを強化し、企業のセキュリティ要件または戦略をサポートするため、AKS ではクラスターとノード プール レベルの両方で SSH の無効化 (プレビュー) がサポートされています。 サポートされている唯一のソリューションでは、AKS のサブネットとノードのネットワーク インターフェイス カード (NIC) でネットワーク セキュリティ グループ規則を構成する必要がありますが、それと比較して、SSH の無効化では簡略化されたアプローチが導入されます。

クラスターの作成時に SSH を無効にすると、クラスターの作成後に有効になります。 一方、既存のクラスターまたはノード プールで SSH を無効にすると、AKS は SSH を自動的に無効にしません。 いつでもノード プールのアップグレード操作を選んで実行できます。 SSH キーの無効化と有効化の操作は、ノード イメージの更新が完了した後で有効になります。

SSH パラメーター 説明
disabled SSH サービスが無効にされます。
localuser SSH サービスが有効にされ、SSH キーを持つユーザーはノードに安全にアクセスできます。

Note

kubectl debug node は、SSH サービスに依存しないため、SSH を無効にした後も引き続き動作します。

新しいクラスターのデプロイで SSH を無効にする

既定では、AKS クラスター ノードの SSH サービスは、クラスター上のすべてのユーザーと実行されているポッドに対して開かれています。 ポッド内のコンテナーが侵害された場合に攻撃ベクトルを制限するため、任意のネットワークからクラスター ノードへの直接 SSH アクセスを禁止できます。 az aks create コマンドを使って新しいクラスターを作成するときに、すべてのノード プールで SSH を無効にする (プレビュー) には、--ssh-access disabled 引数を指定します。

重要

SSH サービスを無効にした後は、クラスターに SSH 接続して管理タスクを実行したり、トラブルシューティングを行ったりすることはできません。

az aks create -g myResourceGroup -n myManagedCluster --ssh-access disabled

数分後、コマンドが完了し、クラスターに関する情報が JSON 形式で返されます。 SSH の無効化に関連する出力と結果は次の例のようになります。

"securityProfile": {
"sshAccess": "Disabled"
},

既存のクラスターで SSH を無効にする

az aks update コマンドを使って既存のクラスターを更新するときに、クラスターのすべてのノード プールで SSH を無効にする (プレビュー) には、--ssh-access disabled 引数を指定します。

az aks update -g myResourceGroup -n myManagedCluster --ssh-access disabled

数分後、コマンドが完了し、クラスターに関する情報が JSON 形式で返されます。 SSH の無効化に関連する出力と結果は次の例のようになります。

"securityProfile": {
"sshAccess": "Disabled"
},

変更を有効にするには、az aks nodepool upgrade コマンドを使って、すべてのノード プールを再イメージ化する必要があります。

az aks nodepool upgrade --cluster-name myManagedCluster --name mynodepool --resource-group myResourceGroup --node-image-only

重要

この操作中に、すべての仮想マシン スケール セット インスタンスがアップグレードされ、再イメージ化されて新しい SSH 構成を使うようになります。

新しいノード プールで SSH を無効にする

az aks nodepool add コマンドを使ってノード プールを追加し、ノード プールの作成時に SSH を無効にするには、--ssh-access disabled 引数を指定します。

az aks nodepool add --cluster-name myManagedCluster --name mynodepool --resource-group myResourceGroup --ssh-access disabled  

数分後、コマンドが完了し、mynodepool が正常に作成されたことを示すクラスターに関する情報が、JSON 形式で返されます。 SSH の無効化に関連する出力と結果は次の例のようになります。

"securityProfile": {
"sshAccess": "Disabled"
},

既存のノード プールで SSH を無効にする

既存のノード プールで SSH を無効にする (プレビュー) には、[az aks nodepool update][az-aks-nodepool-update] command with the --ssh-access disabled` 引数を使います。

az aks nodepool update --cluster-name myManagedCluster --name mynodepool --resource-group myResourceGroup --ssh-access disabled

数分後、コマンドが完了し、mynodepool が正常に作成されたことを示すクラスターに関する情報が、JSON 形式で返されます。 SSH の無効化に関連する出力と結果は次の例のようになります。

"securityProfile": {
"sshAccess": "Disabled"
},

変更を有効にするには、az aks nodepool upgrade コマンドを使って、ノード プールを再イメージ化する必要があります。

az aks nodepool upgrade --cluster-name myManagedCluster --name mynodepool --resource-group myResourceGroup --node-image-only

既存のクラスターで SSH を再度有効にする

az aks update コマンドを使って既存のクラスターを更新するときに、クラスターのすべてのノード プールで SSH を再度有効にする (プレビュー) には、--ssh-access localuser 引数を指定します。

az aks update -g myResourceGroup -n myManagedCluster --ssh-access localuser

プロセスの実行中に、次のメッセージが返されます。

Only after all the nodes are reimaged, does the disable/enable SSH Access operation take effect."

SSH を再度有効にした後、ノードは自動的には再イメージ化されません。 いつでも再イメージ化操作を選んで実行できます。

重要

この操作中に、すべての仮想マシン スケール セット インスタンスがアップグレードされ、再イメージ化されて新しい SSH 公開キーを使うようになります。

特定のノード プールで SSH を再度有効にする

az aks update コマンドを使って特定のノード プールを更新するときに、クラスターのそのノード プールで SSH を再度有効にする (プレビュー) には、--ssh-access localuser 引数を指定します。 次の例では、nodepool1 が対象のノード プールです。

az aks nodepool update --cluster-name myManagedCluster --name nodepool1 --resource-group myResourceGroup --ssh-access localuser 

プロセスの実行時に、次のメッセージが返されます。

Only after all the nodes are reimaged, does the disable/enable SSH Access operation take effect.

重要

この操作中に、すべての仮想マシン スケール セット インスタンスがアップグレードされ、再イメージ化されて新しい SSH 公開キーを使うようになります。

SSH サービスの状態

1 つのノードに対して node-shell を使用し、systemctl を使って SSH サービスの状態を調べるには、次の手順のようにします。

  1. kubectl node-shell <node> コマンドを実行して、標準の bash シェルを取得します。

    kubectl node-shell aks-nodepool1-20785627-vmss000001
    
  2. systemctl コマンドを実行して、SSH サービスの状態を確認します。

    systemctl status ssh
    

次に示すのは、SSH が無効にされた場合の結果の出力例です。

ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/lib/systemd/system/ssh.service; disabled; vendor preset: enabled)
     Active: inactive (dead) since Wed 2024-01-03 15:36:57 UTC; 20min ago

次に示すのは、SSH が有効にされた場合の結果の出力例です。

ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2024-01-03 15:40:20 UTC; 19min ago

次のステップ

クラスター ノードへの SSH 接続に関する問題のトラブルシューティングに役立つには、kubelet ログを表示するか、Kubernetes マスター ノード ログを表示できます。