GitOps デプロイ モデルにセキュリティ上の問題がある場合 (たとえば、入力ミスによる権限の構成ミスなど)、これは実行時に発見されるまで伝播され、ほとんどのセキュリティ イベントがスキャンまたは検出されます。
インフラストラクチャの潜在的なセキュリティ問題をソースで修正できるとしたら?
基本から始めましょう。
Gitは、オープン ソースの分散型バージョン管理システムです。ファイル (通常はソース コードなどのテキスト ファイル) で行われた変更を追跡し、共同作業モデルを可能にし、促進します。これは、今日のバージョン管理システムの事実上の標準です。
ラップトップでローカルに独自の git リポジトリを作成したり、独自のサーバーでホストしたり、GitLab や GitHub などのプロバイダーを使用したりできます。
リポジトリの管理方法にはさまざまな「フロー」がありますが (git-flow、github-flow など)、git の使用方法の基本的な例は次のようなものです。 ファイルの変更は、ユーザーによって「コミット」されます。リポジトリを「フォーク」し、「ブランチ」で適切な変更を行います。
次に、ユーザーはリクエスト (「プル リクエスト」、「マージ リクエスト」、または「パッチの送信」のいずれか) を作成して、それらの変更をリポジトリに含めます。
その後、通常は「所有者」とリクエストを作成したユーザーの間で話し合いが行われ、問題がなければ変更が受け入れられ、リポジトリに追加されます。
注: 詳細を知りたい場合は、git プル リクエスト メカニズムに関するより詳細な情報を参照してください。
実際の例を確認するには、お気に入りのオープン ソース GitLab または GitHub リポジトリを参照し、[プル リクエスト] (または [マージ リクエスト]) タブを参照します (または、楽しいものについてはこちらを参照してください)。提案された変更、コメント、ラベル、変更を提案した人、提案された変更に対して検証を実行しているツール、リポジトリを見ている人に送信された通知などを確認できます。
簡単に言うと、 GitOps は、ソフトウェア資産の信頼できる唯一の情報源として git リポジトリを使用する方法論にすぎないため、git デプロイ モデル (プル リクエスト、ロールバック、承認など) をソフトウェアに活用できます。
書籍 ( The Path to GitOps 、 GitOps and KubernetesまたはGitOps Cloud-native Continuous Deployment )、ホワイトペーパー、数え切れないほどのブログ投稿がありますが、物事がどのように進化したかを簡単に見て、 GitOpsの目的を詳しく説明しましょう。ここ数年で。
クラウドが登場する前は、アプリケーションをホストする新しいサーバーを追加するのに数週間かかりました。許可を求めて購入し、多くの手動タスクを実行する必要がありました。その後、仮想化によって物事がはるかに簡単になりました。いくつかのスペックを持つ仮想マシンをリクエストすると、数分後にアクセスできるようになります。
次に、クラウド。サーバー、ネットワーク、ストレージ、さらにはデータベース、メッセージング キュー、コンテナー、機械学習、サーバーレスなどの要求は、API 呼び出しだけで行うことができます。あなたはそれを要求し、数秒後にそれを取得します。使用した分だけ支払う必要があります。これはまた、API 呼び出しを実行するコードとしてインフラストラクチャを管理できることを意味します...そして、コードをどこに保存しますか? git リポジトリ (またはその他のコンテンツ バージョン システム)。
GitOps という用語は、 2017 年に Weaveworks によって造られました。OpenGitOpsを言い換えると、GitOps システムは次の原則に基づいています。
GitOps 方法論の本質は、基本的にはクラスター上で実行されている Kubernetes コントローラーまたはコントローラー(またはエージェント) であり、その上で実行されている Kubernetes オブジェクト ( CustomResourceによって定義されている) を監視し、現在の状態を Git repo で指定された状態と比較します。一致しない場合は、リポジトリで見つかったマニフェストを適用してアプリケーションを修正します。
注: GitOps には、プッシュとプル、構成管理の処理方法など、わずかに異なるアプローチがあります。これらは高度なトピックですが、ここでは基本に固執しましょう。
次の図は、簡略化された GitOps システムを示しています。
Git ベースであることは、開発者にとって摩擦がないことを意味します。対話する新しいツールについて心配する必要はありませんが、Git リポジトリでコードを管理するために使用されるのと同じプラクティスを適用します。
GitOps ツールについて言えば、 FluxやArgoCDなどのオープン ソース ツールを含むいくつかのツールが既に利用可能であり、どちらもCNCF のインキュベーション プロジェクトです。
GitOps を介してアプリケーション定義がどのように見えるかを理解するために、これは Flux または ArgoCD によって管理される単純なアプリケーション (GitHub リポジトリに格納されている) の例です。
フラックスあり:
--- apiVersion: source.toolkit.fluxcd.io/v1beta2 kind: GitRepository metadata: name: my-example-app namespace: hello-world spec: interval: 30s ref: branch: master url: https://github.com/xxx/my-example-apps.git --- apiVersion: kustomize.toolkit.fluxcd.io/v1beta2 kind: Kustomization metadata: name: my-example-app namespace: hello-world spec: interval: 5m0s path: ./myapp prune: true sourceRef: kind: GitRepository name: my-example-app targetNamespace: hello-world
ArgoCD の場合:
apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: my-example-app namespace: hello-world spec: destination: namespace: my-example-app server: https://kubernetes.default.svc project: default source: path: myapp/ repoURL: https://github.com/xxx/my-example-apps.git targetRevision: HEAD syncPolicy: automated: {} syncOptions: - CreateNamespace=true
どちらも、アプリケーション マニフェストが格納されている Git リポジトリ (デプロイ)、名前空間、およびその他の詳細を参照します。
コードとしてのインフラストラクチャは、さまざまな手法とツールを使用して、インフラストラクチャのビルディング ブロックをコードとして扱う方法論です。これは、VM、コンテナ、ネットワーク、ストレージなどのインフラストラクチャを、お気に入りのインフラストラクチャ プロバイダーの Web インターフェイスを介して手動で作成する代わりに、コードとして定義し、選択したツールによって作成/更新/管理されることを意味します。 terraform 、 crossplane 、またはpulumiなど。
メリットは非常に大きいです。インフラストラクチャをコードのように管理し (現在はコードです)、開発のベスト プラクティス (自動化、テスト、トレーサビリティ、バージョン管理など) をインフラストラクチャ資産に活用できます。実際、「ソフトウェアとしてのインフラストラクチャ」という用語を代わりに使用する傾向があります。これは、単なるコード以上のものであるためです。
このトピックに関する情報は山ほどありますが、 次のリソースが出発点として適切です。
ご想像のとおり、GitOps は Infrastructure as Code を宣言型モデルとして利用してインフラストラクチャを定義します。実際、IaC は GitOps の基礎の 1 つです。しかし、IaC は GitOps の残りの原則を義務付けていないため、それだけではありません。
「DevOps」という用語には多くの定義があります。誰に尋ねるかにもよりますが、簡単に言えば、「DevOps とは、摩擦を減らして高速にソフトウェアを構築して提供するためのプラクティスとツールの組み合わせです。」
GitOps は DevOps プラクティスに一致するフレームワークを提供するため、DevOps 方法論は GitOps を活用できますが、厳密には必要ではありません。
NoOps は2021 年に Forrester によって造られました。これは、IT 環境が抽象化され、手動で管理する必要がなくなるまで自動化された運用を処理するための根本的なアプローチです。
GitOps は、Git リポジトリで目的の状態に修正することで手動の変更を減らすのに役立ちますが、IT 環境全体に実際の NoOps を適用することは、現時点では実際の目標ではなく、野心的な目標です。
いいえ。Kubernetes、コントローラー パターン、および Kubernetes オブジェクトを定義する宣言型モデルは、GitOps 方法論に完全に一致しますが、GitOps 方法論を Kubernetes なしで適用できないという意味ではありません。 Kubernetes の外部で GitOps を使用する場合、冪等性の処理、アセットの削除/作成、シークレット管理など、いくつかの課題があります。しかし、GitOps の原則は Kubernetes なしで適用できます(そして少しの創造性を適用します)。
ここで、セキュリティの側面について話しましょう。ほとんどのセキュリティ ツールは、潜在的な脆弱性と問題を実行時に検出します (遅すぎます)。それらを修正するには、リアクティブな手動プロセスを実行する必要があります (例: kubectl edit を使用して k8s オブジェクトのパラメーターを直接変更する) か、理想的には修正がソースで行われ、サプライ チェーン全体に伝播されます。これが「シフトセキュリティレフト」と呼ばれるものです。手遅れになったときに問題を修正することから、問題が発生する前に修正することまで。
これは、すべてのセキュリティ問題をソースで修正できるという意味ではありませんが、セキュリティ レイヤーをソースに直接追加することで、いくつかの問題を防ぐことができます。
まず、一般的なセキュリティの推奨事項が適用されます。
GitOps 方法論が一般的にセキュリティを向上させるいくつかのシナリオを見てみましょう。
これらの利点は、GitOps の方法論を使用してセキュリティ体制を改善することを正当化するのに十分なものであり、すぐに使用できるものですが、GitOps はさらにいくつかのものを組み合わせたものです。もっと多くのことができます。 GitHub、GitLab、およびその他の Git リポジトリ プロバイダーを使用すると、プル リクエストを含め、Git リポジトリで実行した変更に基づいてアクションまたはパイプラインを実行できるため、可能性は無限大です。いくつかの例:
GitOps 方法論は、展開モデルにいくつかの改善をもたらし、別のツールを追加する必要なく、テーブルにセキュリティ上の利点をもたらします。
「シフト レフト」レイヤーをソース コードに直接追加することでセキュリティ体制を改善します。また、プル リクエスト モデルの柔軟性のおかげで、ランタイムに影響を与えたり変更したりすることなく、追加のセキュリティ チェックを簡単に追加できます。
ここにも掲載されています。