クラウド・アプリケーションへのエンドツーエンドのセキュリティーの適用
このチュートリアルでは、費用が発生する場合があります。 コスト見積もりツールを使用して、予測使用量に基づいてコスト見積もりを生成します。
このチュートリアルでは、IBM Cloud® カタログで使用できる主要なセキュリティー・サービスと、それらを一緒に使用する方法について説明します。 ファイル共有を提供するアプリケーションによって、セキュリティー概念が実践されます。
潜在的なセキュリティー・リスクを認識し、このような脅威から保護する方法を明確に理解することなしに、アプリケーション・アーキテクチャーは完成しません。 アプリケーション・データはクリティカル・リソースとなり、逸失、漏えい、盗難は許容されません。 また、データは保存時および転送中に暗号化技法によって保護する必要があります。 保存されたデータを暗号化することによって、そのデータが失われたり、盗まれたりした場合でも情報が開示されないように保護されます。 転送中 (インターネットを介してなど) のデータを HTTPS、SSL、TLS などの方法で暗号化することによって、盗聴や中間者攻撃が回避されます。
特定のリソースへのユーザーのアクセスの認証と許可も、多くのアプリケーションに共通の要件となります。 ソーシャル ID を使用する顧客およびサプライヤー、クラウドでホストされるディレクトリーのパートナー、組織の ID プロバイダーの従業員などを対象にした、さまざまな認証スキームのサポートが必要になることがあります。
目標
- ストレージバケット内のコンテンツを独自の暗号化キーで暗号化します。
- アプリケーションにアクセスする前に、ユーザーに認証を要求する。
- クラウドサービス全体におけるセキュリティ関連のAPIコールやその他のアクションを監視および監査します。
このチュートリアルでは、ユーザーのグループが共通のストレージ・プールにファイルをアップロードできるようにし、かつ共有可能なリンクによってこれらのファイルへのアクセスを提供できるようにする、サンプル・アプリケーションを取り上げます。 アプリケーションは Node.js で記述され、 IBM Cloud Kubernetes Service または Red Hat OpenShift on IBM Cloud のいずれかにコンテナとしてデプロイされます。 複数のセキュリティー関連のサービスおよび機能を活用して、アプリケーションのセキュリティーが改善されます。
このチュートリアルは、クラシックインフラストラクチャまたはVPCインフラストラクチャで実行中のクラスタで動作します。
{: caption="図
- ユーザーがアプリケーションに接続します。
- カスタムドメインと TLS 証明書を使用する場合、証明書の管理と発行は Secrets Manager から行います。
- App ID によってアプリケーションが保護され、ユーザーが認証ページにリダイレクトされます。 ユーザーは登録することもできます。
- アプリケーションが、Container Registry に保管されたイメージから Kubernetes クラスターで実行されます。 このイメージは脆弱性がないか自動的にスキャンされます。
- アップロードされたファイルは Object Storage に保管され、付随するメタデータは IBM Cloudant に保管されます。
- オブジェクト・ストレージ・バケット、App ID、および Secrets Manager のサービスが、ユーザー提供の鍵を活用してデータを暗号化します。
- アプリケーション管理アクティビティはIBM Cloud Activity Tracker Event Routingによって記録され、分析のためにIBM Cloud Logsにルーティングされる。
開始前に
このチュートリアルでは、以下が必要です。
- IBM Cloud CLI
- IBM Cloud Kubernetes Service プラグイン (
kubernetes-service
) - Container Registry プラグイン (
container-registry
)
- IBM Cloud Kubernetes Service プラグイン (
kubectl
: Kubernetes クラスターと対話します。git
: ソース・コード・リポジトリーを複製します。
これらのツールをダウンロードしてインストールする方法については、 チュートリアルガイド「ソリューションの始め方」 をご覧ください。
これらのツールのインストールを回避するには、xml-ph-0000@deepl.internalコンソールから Cloud ShellIBM Cloud コンソールから
サービスの作成
次のセクションでは、アプリケーションによって使用されるサービスを作成します。
アプリケーションのデプロイ先の決定
作成するすべてのリソースの ロケーション および リソース・グループ は、 Kubernetes クラスターの ロケーション および リソース・グループ と一致している必要があります。
ユーザーおよびアプリケーションのアクティビティーの収集
The IBM Cloud Activity Tracker Event Routing must be configured to route auditing events to a IBM Cloud Logs target instance. アカウントで現在構成されていない場合は、IBMLogs ターゲットの構成 で説明するように監査イベントをルーティングします。
このチュートリアルの最後に、チュートリアルのステップを完了して生成されたイベントをレビューします。
アプリケーション用のクラスターの作成
IBM Cloud Kubernetes Service および Red Hat OpenShift on IBM Cloud は、 Kubernetes クラスターで実行されるコンテナーに高可用性アプリをデプロイするための環境を提供します。
このチュートリアルで再利用したい既存の Kubernetes クラスターをお持ちの場合は、このセクションをスキップしてください。このチュートリアルの残りの部分では、クラスター名は 「secure-file-storage-cluster」 として参照されます。ご自身のクラスター名に置き換えてください。
このチュートリアルでは、ゾーン 1 つ、ワーカー・ノード 1 つ、提供されている最小サイズ ( フレーバー ) で構成される最小クラスターで十分です。 IBM Cloud Kubernetes Serviceクラスタを作成するには、VPCクラスタの作成 または クラシッククラスタの作成 のいずれかの手順に従ってください。 Red Hat OpenShift on IBM Cloudクラスタを作成するには、VPCクラスタの作成 または クラシッククラスタの作成 のいずれかの手順に従ってください。
自社所有の暗号鍵の使用
Key Protect は、IBM Cloud サービス全体でアプリの暗号鍵をプロビジョンするのに役立ちます。Key Protect および IBM Cloud Object Storage は、保存データを保護するために連携します。 このセクションでは、ストレージ・バケット用のルート・キーを 1 つ作成します。
- Key Protectのインスタンスを作成します。
- ロケーション を選択します。
- 名前を
secure-file-storage-kp
に設定します。 - サービス・インスタンスを作成する リソース・グループ を選択し、「作成」 をクリックします。
- 「鍵」 で 「追加」 ボタンをクリックして、新しいルート鍵を作成します。 この鍵は、ストレージ・バケットおよび App ID データの暗号化に使用します。
- 鍵タイプを 「ルート鍵」 に設定します。
- 名前を
secure-file-storage-root-enckey
に設定します。 - 次に、「鍵の追加 (Add key)」 をクリックします。
独自のキーを使用する (BYOK) には、既存のルート・キーをインポートします。
ユーザー・ファイルのストレージのセットアップ
ファイル共有アプリケーションは、 Object Storage バケットにファイルを保存します。 ファイルとユーザーの関係は、 IBM Cloudant データベースのメタデータとして保存されます。 このセクションでは、以下のサービスを作成および構成します。
コンテンツ用のバケット
- Object Storageのインスタンスを作成します。
- スタンダードプランを選択し、 名前を
secure-file-storage-cos
に設定します。 - 前述のサービスと同じ リソース・グループ を使用し、「作成」 をクリックします。
- スタンダードプランを選択し、 名前を
- 「サービス資格情報」 で、新規資格情報 を作成します。
- 名前を
secure-file-storage-cos-acckey
に設定します。 - 「役割」 には、 「ライター」 を選択します。
- 「詳細オプション (Advanced options)」 の下で、「HMAC 資格情報を含める (Include HMAC Credential)」 にチェック・マークを付けます。 これは署名付き URL の生成に必要です。
- 追加 をクリックします。
- 資格情報をメモしておきます。 後のステップで必要になります。
- 名前を
- ナビゲーション・サイドバーから 「エンドポイント」 をクリックします。
- ビジネス回復力 を 「地域 (Regional)」 に設定し、ロケーション をターゲット・ロケーションに設定します。
- クラシック・インフラストラクチャーの場合: プライベート ・サービス・エンドポイントをコピーします。 後のアプリケーションの構成で使用されます。
- VPC インフラストラクチャーの場合: ダイレクト ・サービス・エンドポイントをコピーします。 後のアプリケーションの構成で使用されます。
バケットを作成する前に、Object Storage サービス・インスタンスに保管されているルート・キーに Key Protect サービス・インスタンスのアクセス権限を付与します。
- IBM Cloud コンソールで 、「管理」>「アクセス(IAM)」>「権限」 に移動します。
- 「作成」 ボタンをクリックします。
- 「ソース・サービス」 メニューで 「Cloud Object Storage (Cloud Object Storage)」 を選択します。
- 「選択された属性に基づくリソース」 に切り替え、「ソース・サービス・インスタンス」 にチェック・マークを付け、先ほど作成した Object Storage サービス・インスタンスを選択します。
- 「ターゲット・サービス」 メニューで、「Key Protect」 を選択します。
- 「選択された属性に基づくリソース」 に切り替え、「インスタンス ID」 にチェック・マークを付け、先ほど作成した Key Protect サービス・インスタンスを選択します。
- リーダー の役割を有効にします。
- 「許可」 ボタンをクリックします。
最後に、バケットを作成します。
- ストレージの下にある リソース リストから Object Storage サービス インスタンスにアクセスします。
- 「バケットを作成 」をクリックし、次に 「バケットをカスタマイズ 」をクリックします。
- name には、
<your-initials>-secure-file-upload
などの固有値を使用します。 - 「耐障害性 (Resiliency)」 を 「リージョン (Regional)」 に設定します。
- 「ロケーション (Location)」 を Key Protect サービス・インスタンスを作成した場所と同じ場所に設定します。
- 「ストレージ・クラス (Storage class)」 を 「標準」 に設定します
- name には、
- 「サービス統合 (オプション)」/「暗号化」 で、鍵管理 を有効にします。
- 「既存インスタンスの使用」 をクリックして、先ほど作成した Key Protect サービス・インスタンスを選択します。
- 鍵として secure-file-storage-root-enckey を選択し、「鍵の関連付け」 をクリックします。
- サービス統合(オプション)/モニタリングとアクティビティ追跡で、アクティビティ追跡を有効にし、監査イベントを分析のために保存します。
- チェックマークをクリックすると、リージョン内の Activity Tracker インスタンスのサービス情報が表示されます。
- ここで、「データ・イベントの追跡」 を有効にし、データ・イベント として 「読み取りおよび書き込み」 を選択します。
- 「バケットの作成」 をクリックします。
ユーザーとそのファイルとの間のデータベース・マップ関係
IBM Cloudant データベースには、アプリケーションからアップロードされたすべてのファイルのメタデータが含まれます。
- IBM Cloudant サービスのインスタンスを作成します。
- オファリングとして Cloudant を選択します。
- マルチテナント 環境と、前述のサービスと同じ リージョン を選択します。
- 名前を
secure-file-storage-cloudant
に設定します。 - 前のサービスと同じ リソース・グループ を使用します。
- 認証方式 を 「IAM」 に設定します。
- 「作成」 をクリックします。
- 「リソース・リスト」 に戻り、新しく作成したサービスを見つけてクリックします 注: 状況が「アクティブ」に変わるまで待つ必要があります。
- 「サービス資格情報」 で、新規資格情報 を作成します。
- 名前を
secure-file-storage-cloudant-acckey
に設定します。 - 「役割」 で 「マネージャー」 を選択します。
- その他の項目はデフォルト値のままにしておいてください。
- 追加 をクリックします。
- 新しく作成した資格情報を展開し、値をメモしておきます。 後のステップで必要になります。
- 「管理」 で、 「ダッシュボードの起動」 をクリックします。
- 「データベースの作成」 をクリックして、
secure-file-storage-metadata
という名前の非分割データベースを作成します。
ユーザー認証
App ID を使用すると、リソースを保護し、アプリケーションに認証を追加できます。 このチュートリアルでは使用しない代わりの方法として、 App ID は、 Kubernetes Service を使用して、クラスターにデプロイされたアプリケーションにアクセスするユーザーを認証することができます。 統合
App ID サービスを作成する前に、Key Protect サービスにサービス・アクセスを付与します。 この作業を行うユーザーは、使用する Key Protect のインスタンスのアカウント所有者または管理者でなければなりません。 App ID サービスに対するビューアー以上のアクセス権限も持っている必要があります。
- 「管理」>「アクセス (IAM)」>「許可」と移動し、「作成」 をクリックします。
- サービスを選択し、 App ID サービスをソースサービスとして選択します。
- ターゲット・サービスとして Key Protect を選択します。
- 「選択された属性に基づくリソース」 に切り替え、「インスタンス ID」 にチェック・マークを付け、先ほど作成した Key Protect サービス・インスタンスを選択します。
- サービス・アクセスで 「リーダー」 役割を割り当てます。
- 「許可」 をクリックし、委任された許可を確認します。
これから、App ID サービスのインスタンスを作成します。
-
サービス作成ページに移動します。 App ID サービス作成ページに移動します。
- 前述のサービスで使用したのと同じ ロケーション を使用します。
- プランとして 「段階的層」 を選択します。
- サービス名を
secure-file-storage-appid
に設定します。 - 前述のサービスと同じ リソース・グループ を選択します。
- 許可された Key Protect サービスの 名前 と ルート鍵 を、それぞれのドロップダウンから選択します。
- 「作成」 をクリックします。
-
「認証の管理」 の 「認証設定」 タブで、アプリケーションに使用するドメインを指す Web リダイレクト URL を追加します。 URL の形式は
https://secure-file-storage.<Ingress subdomain>/redirect_uri
です。 以下に例を示します。- 指定する Ingress サブドメイン:
mycluster-1234-d123456789.us-south.containers.appdomain.cloud
- リダイレクト先は URL で、
https://secure-file-storage.mycluster-1234-d123456789.us-south.containers.appdomain.cloud/redirect_uri
です。
App ID ウェブリダイレクトが必要です。 URL https://www.facebook.com/motionpoint または であること。 http Ingressのサブドメインは、クラスタダッシュボードまたは
ibmcloud ks cluster get --cluster <cluster-name>
で確認できます。 - 指定する Ingress サブドメイン:
-
同じタブの**「認証設定」の「ランタイム・アクティビティー」**で、IBM Cloud Activity Tracker Event Routing のイベントの取り込みを有効にします。
-
サービス資格情報を作成します。
- 「サービス資格情報」 で、新規資格情報 を作成します。
- 名前を
secure-file-storage-appid-acckey
に設定します。 - 「役割」 で 「マネージャー」 を選択します。
- その他の項目はデフォルト値のままにしておいてください。
- 追加 をクリックします。
App ID ダッシュボードで、使用されている ID プロバイダーとログインおよびユーザー管理エクスペリエンスをカスタマイズする必要があります。 このチュートリアルでは、わかりやすくするためにデフォルトを使用します。 実稼働環境では、多要素認証 (MFA) および高度なパスワード・ルールを使用することを検討してください。
アプリのデプロイ
すべてのサービスが構成されました。 このセクションでは、チュートリアル・アプリケーションをクラスターにデプロイします。 これらすべてはシェル環境(ターミナル)から実行できます。
コードを取得する
- アプリケーションのコードを入手します。
git clone https://github.com/IBM-Cloud/secure-file-storage
- secure-file-storage/app ディレクトリーに移動します。
cd secure-file-storage/app
構成設定と資格情報を入力してください
-
ログインしていない場合は、
ibmcloud login
またはibmcloud login --sso
を使用して対話的にログインしてください。 IBM Cloud のリージョンとリソース・グループをターゲットにします。ibmcloud target -r <region> -g <resource_group>
その他の CLI コマンドについては、資料の一般的な IBM Cloud CLI (ibmcloud) コマンドのトピックを参照してください。
-
次のステップで構成ファイルを生成するために必要な環境変数を設定します。
- まず、
<YOUR_CLUSTER_NAME>
を置き換えてクラスター名を設定します。export MYCLUSTER=<YOUR_CLUSTER_NAME>
ibmcloud ks
コマンドを使用して Ingress サブドメインを設定します。export INGRESS_SUBDOMAIN=$(ibmcloud ks cluster get --cluster $MYCLUSTER --output json | jq -r 'try(.ingressHostname) // .ingress.hostname')
ibmcloud ks
コマンドを使用して Ingress シークレットを設定します。export INGRESS_SECRET=$(ibmcloud ks cluster get --cluster $MYCLUSTER --output json | jq -r 'try(.ingressSecretName) // .ingress.secretName')
- イメージ・リポジトリー名を、事前作成されたイメージ
icr.io/solution-tutorials/tutorial-cloud-e2e-security
に設定します。export IMAGE_REPOSITORY=icr.io/solution-tutorials/tutorial-cloud-e2e-security
- デフォルト値を置き換えて、追加の環境変数を設定します。
export BASENAME=secure-file-storage
- 使用する名前空間を設定します。
export TARGET_NAMESPACE=default
default
ネームスペースおよび画像の IBM Cloud Container Registry 以外の Kubernetes ネームスペースを使用している場合にのみ、オプションで$IMAGE_PULL_SECRET
環境変数を設定します。 この場合、追加の Kubernetes 構成が必要になります (新しい名前空間でコンテナー・レジストリー・シークレットを作成するなど)。
- まず、
-
secure-file-storage.yaml
とsecure-file-storage-ingress.yaml
を生成するには、以下のコマンドを実行します。 先ほど設定した環境変数とテンプレートファイルsecure-file-storage.template.yaml
およびsecure-file-storage-ingress.template.yaml
を一緒に使用します。./generate_yaml.sh
例として、アプリケーションがデフォルトの Kubernetes 名前空間にデプロイされているとします。
スクリプトによって使用される環境変数 変数 値 説明 $IMAGE_PULL_SECRET
提供されたイメージを使用する場合は定義しない レジストリーにアクセスするためのシークレット。 $IMAGE_REPOSITORY
icr.io/solution-tutorials/tutorial-cloud-e2e-security または icr.io/namespace/image-name ビルドされたイメージを指す URL に似た ID。前のセクションのレジストリー URL、名前空間、イメージ名に基づきます。 $TARGET_NAMESPACE
デフォルト アプリがプッシュされる Kubernetes 名前空間。 $INGRESS_SUBDOMAIN
secure-file-stora-123456.us-south.containers.appdomain.cloud クラスターの概要ページから取得するか、 ibmcloud ks cluster get --cluster <your-cluster-name>
を使用して取得します。$INGRESS_SECRET
secure-file-stora-123456 ibmcloud ks cluster get --cluster <your-cluster-name>
を使用して取得します。$BASENAME
secure-file-storage リソースを識別するために使用される接頭部。 -
credentials.template.env
をcredentials.env
にコピーします。cp credentials.template.env credentials.env
-
credentials.env
を編集し、空白に以下の値を入力します。- Object Storage サービスのリージョン・エンドポイント、バケット名、Object Storage サービス用に作成された資格情報。
- secure-file-storage-cloudant の認証情報、
- および App IDの資格情報。 変数
appid_redirect_uris
は、上記で説明したリダイレクト URI のコンマ区切りリストです。
Cloud Shell を使用している場合、
nano credentials.env
を使用してファイルを編集できます。
クラスターへのデプロイ
- 指示に従ってクラスタにアクセスします。コンソール概要ページの 「アクション」メニュー からアクセスできる CLI経由で接続します。
ibmcloud ks cluster config --cluster $MYCLUSTER --admin
- ターゲット名前空間で Ingress シークレットが使用可能であることを確認します。 そうでない場合は、作成する必要があります。
Ingress シークレットに CRN がある場合は、その名前と CRN を使用して、ターゲット名前空間にシークレットを作成します。ibmcloud ks ingress secret ls -c $MYCLUSTER
Ingress シークレットに CRN がない場合は、以下のコマンドを使用してターゲット名前空間に再作成します。ibmcloud ks ingress secret create -c $MYCLUSTER -n $TARGET_NAMESPACE --cert-crn <crn-shown-in-the-output-above> --name <secret-name-shown-above>
kubectl get secret $INGRESS_SECRET --namespace=ibm-cert-store -oyaml | grep -v '^\s*namespace:\s'| kubectl apply --namespace=$TARGET_NAMESPACE -f -
- アプリケーションがサービス資格情報を取得するために使用するシークレットを作成します。
kubectl create secret generic secure-file-storage-credentials --from-env-file=credentials.env
- アプリをデプロイします。
kubectl apply -f secure-file-storage.yaml
- パブリック・インターネットからアクセスできるように、アプリのネットワーク・ルーティング ( ClusterIP サービスと Ingress) をデプロイします。
kubectl apply -f secure-file-storage-ingress.yaml
アプリケーションのテスト
アプリケーションには https://secure-file-storage.<your-cluster-ingress-subdomain>/
でアクセスできます。
- アプリケーションのホーム・ページに移動します。 App ID のデフォルトのログイン・ページにリダイレクトされます。
- 有効な E メール・アドレスを使用して新しいアカウントを登録します。
- 受信ボックスにアカウントを確認する E メール・アドレスが届くまで待機します。
- ログインします。
- アップロードするファイルを選択します。 「アップロード」 をクリックします。
- ファイルに対して 「共有」 アクションを使用して、ファイルにアクセスする他のユーザーと共有できる署名付き URL を生成します。 このリンクは 5 分後に期限切れになるように設定されています。
認証されたユーザーには、ファイルを保管するための専用のスペースがあります。 ユーザーは、お互いのファイルを表示することはできませんが、署名付き URL を生成して、特定のファイルへの一時的なアクセス権限を付与できます。
アプリケーションの詳細については 、ソースコードリポジトリをご覧ください。
セキュリティー・イベントのレビュー
アプリケーションとそのサービスが正常にデプロイされたため、そのプロセスによって生成されたセキュリティー・イベントをレビューできるようになりました。 すべてのイベントは、IBM Cloud Logs インスタンスで一元的に利用できます。
- Observability ダッシュボードから、Cloud Logs タブを選択し、監査イベントを受信しているIBM Cloud Logsインスタンスを見つけ、Open dashboard をクリックします。
- リソースをプロビジョンしてそれらのリソースと対話作業をする過程でサービスに送信されたすべてのログを確認します。
オプション: カスタム・ドメインの使用およびネットワーク・トラフィックの暗号化
デフォルトでは、 containers.appdomain.cloud
の一般的なサブドメインでアプリケーションにアクセスできます。 ただし、デプロイされたアプリとともにカスタム・ドメインを使用することもできます。 https の継続的なサポートについては、暗号化されたネットワーク・トラフィックを使用してアクセスし、必要なホスト名の証明書またはワイルドカード証明書を提供する必要があります。 Kubernetes アプリケーションに統合するために
DNS 名と TLS 証明書を管理するために使用できるサービスには、さまざまな組み合わせがあります。 このチュートリアルでは、以下のサービスを使用します。
- IBM Cloud Internet Services (CIS) サービスによって管理される、独自のカスタム DNS ドメインの DNS サブドメイン、 secure-file-storage。 このチュートリアルのステップを単純化するために、カスタム DNS ドメインの名前には example.com を使用します。必ず、すべてのステップでカスタム DNS ドメインに置き換えてください。
- Let 's Encrypt: TLS 証明書を生成します。
- IBM Cloud Secrets Manager は、Let 's Encrypt と統合して secure-file-storage.example.com 用の TLS 証明書を生成し、安全に保管します。
- Kubernetes 外部 Secrets Operator: Secrets Manager
以下の手順の代わりに、DNS プロバイダーでアプリ URI を指す CNAME を作成し、TLS 証明書を生成して、そのコンポーネントを Secrets Managerにインポートすることもできます。
Provision CISとSecrets Managerインスタンス
- IBM Cloud Internet Services インスタンスが必要です。 既存のインスタンスを使用するか、この カタログ・エントリー からインスタンスを作成します。 無料トライアルなど、いくつかの料金プランをご利用いただけます。 新しい CIS のプロビジョニング・プロセスでは、 CIS提供のドメイン・ネーム・サーバーを使用するために既存の DNS レジストラー ( IBM Cloudにはない可能性があります) を構成する方法について説明します。 シェル・ウィンドウでカスタム・ドメインをエクスポートします。
export MYDOMAIN=example.com
- Secrets Managerのインスタンスが必要です。 既存のインスタンスを使用するか、 Secrets Manager サービス・インスタンスの作成 で説明されている新しいインスタンスを作成します。 新規インスタンスを作成する場合は、 secure-file-storage-sm という名前を付けます。 先ほど作成した Key Protect インスタンスと統合することで、保管中の秘密のセキュリティを強化することができます。
Kubernetes クラスター Ingress サブドメイン を別名として使用して、 CIS インスタンスに DNS エントリーを作成します。
- CIS サービス・インスタンスを開きます。これは リソース・リスト にあります。
- 左側の 「信頼性」タブをクリックします。
- 上部の DNSタブをクリックします。
- 「DNS レコード」セクションまでスクロールダウンし、 「追加」 をクリックして新規レコードを作成します。
- タイプ: CNAME
- 名前: secure-file-storage
- 別名: クラスターの 「Ingress サブドメイン (Ingress subdomain)」。 シェルで正しい値を取得するには、次のコマンドを実行します。
echo $INGRESS_SUBDOMAIN
- 「追加」 をクリックして、新規レコードを追加します。
Secrets Manager インスタンスを Let 's Encrypt に接続します。
-
Let 's Encrypt ACME アカウントおよび関連する .pem ファイルが必要です。 既存のものを使用するか、 作成 します。
- acme-account-creation-tool をインストールします。 Let 's Encrypt ACME アカウントの作成 には、手順と作成ツールへのリンクが含まれています。
- acme-account-creation-tool を実行して、この secure-file-storage の例に特化したアカウントを作成します。 以下に例を示します。
$ ./acme-account-creation-tool-darwin-amd64 -e YOUREMAIL -o secure-file-storage.example.com -d letsencrypt-prod INFO[2022-12-28T13:30:00-08:00] Registering a new account with the CA INFO[2022-12-28T13:30:00-08:00] Account information written to file : secure-file-storage.example.com-account-info.json INFO[2022-12-28T13:30:00-08:00] Private key written to file : secure-file-storage.example.com-private-key.pem Account Info { "email": "YOUREMAIL", "registration_uri": "https://acme-v02.api.letsencrypt.org/acme/acct/891897087", "registration_body": { "status": "valid", "contact": [ "mailto:YOUREMAIL" ] } }% $ ls secure-file-storage.example.com-account-info.json secure-file-storage.example.com-private-key.pem
-
Let 's Encrypt ACME アカウントを Secrets Manager インスタンスに接続します。 詳しくは、 UI での認証局構成の追加 を参照してください。
- Secrets Manager サービス・インスタンスを開きます。これは リソース・リスト にあります。
- 左側の 「シークレット・エンジン」 を開き、 「パブリック証明書」 をクリックします。
- 「認証局」 の下の 「追加」 をクリックします。
- 名前: LetsEncrypt および 認証局: Let 's Encrypt。
- 「ファイルの選択」 で 「ファイルの追加」 をクリックし、 secure-file-storage.example.com-private-key.pem または選択機能から既存の .pem ファイルを選択します。
- 追加 をクリックします。
-
CIS を DNS プロバイダーとして接続します。
- 「DNS プロバイダー」の下の 「追加」 をクリックします。
- 名前 cis を選択し、ドロップダウンから Cloud Internet Services を選択します。
- 次へ をクリックします。
- 「許可」 タブで、 CIS インスタンスを選択します。
- 追加 をクリックします。
-
Secrets Manager での証明書の注文
- Secrets Manager サービスを開き、左側の シークレット を選択します。
- 追加 をクリックします。
- 「パブリック証明書」 をクリックし、 「次へ」 をクリックします。
- 次のフォームに入力します。
- 名前 - 覚えておくことができる名前を入力します。
- 説明 - 任意の説明を入力します。
- 「次へ」 をクリックします。
- 認証局 の下で、構成済みの Let's Encrypt 認証局エンジンを選択します。
- 鍵アルゴリズム の下で、任意のアルゴリズムを選択します。
- バンドル証明書 - オフのままにします。
- 自動証明書ローテーション - オフのままにします。
- DNS プロバイダー で、構成済みの DNS プロバイダー・インスタンスを選択します。
- ドメインの選択 をクリックし、ワイルドカードで選択 をオンにし、ドメイン自体のチェックを外したままにして、完了 をクリックします。
- 次へ をクリックします。
- 選択内容を確認して、 「追加」 をクリックします。
- アクティブなシークレットの 3 つの垂直ドット・メニューをクリックし、 「詳細」 を選択して、ダイアログから CRN をコピーします。 値をシェルにエクスポートします。 出力は、次のようになります。
export PUBLIC_CERT_CRN=crn:v1:bluemix:public:secrets-manager:eu-de:a/abc123abc123abc123abc123:99999999-9999-9999-9999-999999999999:secret:aaaaaaaa-9999-9999-aaaa-123456781234
-
このチュートリアルでは、サービス間の許可を利用して、 Secrets Manager サービス・インスタンスとその管理対象シークレットへのアクセス権限をクラスターに付与します。
- 「IAM 許可(IAM Authorizations)」ページ に移動し、 「作成」 をクリックして新しい許可を追加します。
- 「ソース」 で Kubernetes Service を選択し、 「特定のリソース」 をクリックして選択します。 次に、 「ソース・サービス・インスタンス」 でクラスターを選択します。
- 「ターゲット」 で Secrets Manager を選択し、次に 「特定のリソース」 および 「インスタンス ID」 を選択して、 Secrets Manager サービス・インスタンスを選択します。
- 最後に、 「役割」 で 「管理者」 を選択し、 「許可」 をクリックして許可を付与します。
-
MYDOMAIN および PUBLIC_CERT_CRN の値が環境にエクスポートされていることを確認します。
echo MYDOMAIN $(printenv MYDOMAIN) echo PUBLIC_CERT_CRN $(printenv PUBLIC_CERT_CRN)
-
新しい TLS 証明書から Ingress シークレットを作成します。
ibmcloud ks ingress secret create --name secure-file-storage-certificate --cluster $MYCLUSTER --cert-crn $PUBLIC_CERT_CRN --namespace $TARGET_NAMESPACE
-
以下のコマンドを実行して、構成ファイルの新規コピーを生成します。 テンプレート・ファイル
secure-file-storage.template.yaml
およびsecure-file-storage.template-ingress.yaml
と一緒に構成したすべての環境変数が使用されます。 まず、現行バージョンを保存することをお勧めします。cp secure-file-storage.yaml /tmp cp secure-file-storage-ingress.yaml /tmp
./generate_yaml.sh
-
クラスタに構成変更を適用します
kubectl apply -f secure-file-storage-ingress.yaml
-
再度ブラウザーに切り替えます。 IBM Cloud リソース・リストで、前に作成および構成したApp ID サービスを見つけ、その管理ダッシュボードを起動します。
- 左側の 「認証の管理 (Manage Authentication)」 をクリックし、上部の 「認証設定 (Authentication Settings)」 タブをクリックします。
- 「Web リダイレクト URL の追加」 フォームで、別の URL として
https://secure-file-storage.example.com/redirect_uri
を追加します。
- これですべてが配置されました。 構成したカスタム・ドメイン
https://secure-file-storage.<your custom domain>
でアプリにアクセスして、アプリをテストします。
セキュリティー: サービス資格情報のローテーション
セキュリティーを維持するには、サービス資格情報、パスワード、およびその他の鍵を定期的に置き換える (ローテーションする) 必要があります。 多くのセキュリティー・ポリシーでは、90 日ごとなどの頻度でパスワードと資格情報を変更する必要があります。 さらに、従業員がチームを離れる場合や、疑わしいセキュリティー・インシデントに遭遇した場合は、アクセス権を即時に変更する必要があります。
このチュートリアルでは、サービスはさまざまな目的で使用されます。例えば、セキュア・アプリケーション・アクセスを介したファイルとメタデータの保管を始め、コンテナー・イメージの管理に至るまでさまざまです。 サービス資格情報のローテーションでは通常、以下の処理が行われます
- 既存のサービス・キーを名前変更する
- 以前に使用された名前を持つ資格情報の新規セットを作成する
- 既存の Kubernetes シークレットのアクセス・データを置き換えて、変更を適用する
- 検証後に古いサービス・キーを削除して以前の資格情報を非アクティブにする。
チュートリアルを発展させる
セキュリティーに終わりはありません。 以下の提案を試して、アプリケーションのセキュリティーを強化してください。
- IBM Key Protect を Hyper Protect Crypto Services に置き換えて、暗号鍵に対するセキュリティーと制御を強化します。
リソースの共有
このソリューション・チュートリアルのリソースを他のユーザーと共同で使用したい場合は、全部または一部のコンポーネントを共有することができます。IBM Cloud の ID およびアクセス管理 (IAM) で、ユーザーとサービス ID の認証、およびクラウド・リソースへのアクセス制御を行うことができます。 リソースに対するアクセス権限を付与するために、事前定義されたアクセス役割を、ユーザー、サービス ID、またはアクセス・グループに割り当てることができます。 アクセス・グループを作成すると、ユーザーとサービス ID の集合を 1 つのエンティティーとして編成できます。 これにより、アクセス権限の割り当てが容易になります。 個々のユーザーまたはサービス ID ごとに同じアクセス権限を複数回割り当てるのではなく、単一のポリシーをグループに割り当てることができます。 つまり、開発プロジェクトに対する役割に応じてグループを編成し、セキュリティーとプロジェクト管理を合わせることができます。
個々のサービスと各サービスに用意されている IAM アクセス役割については、以下を参照してください。
- Kubernetes Service または Red Hat OpenShift on IBM Cloud の場合と同じです。
- Container Registry
- App ID
- IBM Cloudant
- Object Storage
- IBM Cloud Activity Tracker Event Routing
- Key Protect
- Secrets Manager
まずは、アクセス管理のベスト・プラクティスとアクセス・グループの定義方法を確認してください。
リソースを削除する
リソースを削除するには、デプロイされたコンテナーを削除してから、プロビジョンされたサービスを削除します。
他のユーザーとアカウントを共有している場合は、常に、自分のリソースのみを削除するようにします。
-
デプロイ済みのネットワーク構成とコンテナーを削除します。
kubectl delete -f secure-file-storage-ingress.yaml
その後、以下のコマンドを実行します
kubectl delete -f secure-file-storage.yaml
-
デプロイメントのシークレットを削除します。
kubectl delete secret secure-file-storage-credentials
-
Secrets Managerを使用した場合は、 関連するサービスをサービス許可から削除してください。
-
IBM Cloud リソース・リストで、このチュートリアルのために作成されたリソースを見つけます。 検索ボックスおよび secure-file-storage をパターンとして使用します。 各サービスの横のコンテキスト・メニューをクリックし、「サービスの削除」 を選択して、各サービスを削除します。 Key Protect サービスは、キーが削除された後にのみ削除できます。 サービス・インスタンスをクリックして、関連ダッシュボードを取得し、キーを削除します。
リソースによっては、即時に削除されずに保持される場合があります (デフォルトでは 7 日間)。 リソースを完全に削除して再利用することも、保存期間内に復元することもできます。 リソースの再利用を使用する方法については、この資料を参照してください。