
K8s向けアンチウイルス。Kubernetes上で動作するアプリケーションを、事前登録されたソースコード、ランタイムプロセスの監視、分析、アラート、そしてコミュニティとの検出結果の共有により、悪意のある攻撃から保護します。ランサムウェアからも守るかもしれません。
私たちは、お気に入りのKubernetesエコシステムへの攻撃と戦うために、これをオープンソースとして維持したいと考えています。継続的な貢献により、コミュニティとして脅威と戦うことができます。
Tarianの仕組みは?
Tarianは、メインアプリケーションのPod内でサイドカーコンテナとして動作し、プロセスIDの変更、実行中のプロセス数、親子プロセスの関係の変化、アプリケーションに属するファイルシステム内のファイルやディレクトリ、ファイル署名の変更などを監視します。Tarianは開発環境から本番環境までアプリケーションのPodの一部となるため、コンテナ内で何が起こり、何が実行されるべきか、何を監視できるか、何を通知できるか、検出された変更に基づくアクション(Podの自己破壊など)をTarian DBに事前登録できます。シフトレフトで検出メカニズムを導入しましょう!
Tarianの登録DBにない未知の変更がコンテナ内で発生した場合、Tarianはどのように対応しますか?
未知の変更が発生した場合、Tarianは単純にセキュリティチームに観測された分析結果を通知し、ログを送信することができます。その後、セキュリティエンジニアはその変更が脅威かどうかをTarian DBに登録し、分析に基づいて実行するアクションを設定できます。そのアクションはコマンドとしてサイドカーのTarianアプリに送信され、実行されます。
コミュニティの貢献は、Tarianを介して脅威と戦うためにどのように役立ちますか?
セキュリティ専門家によって分析され脅威としてマークされた新しい検出情報は、希望する場合、オープンソースのTarianコミュニティDBに共有できます。これには、すべてのログ、検索すべき文字列、観察結果、透明性、設定すべきアクション、専門家がコミュニティに警告・共有したい情報が含まれます。Tarianユーザーはその情報を利用し、自身の環境で使用するTarianアプリにアクションを設定できます。これにより、脅威に関する情報とその対処法が共有され、Tarianを使用する全員がそれぞれのK8s環境で分析結果を共有し、知識と経験に基づいて共同でアクションを取ることができます。
既知の脅威に対してTarianはどのようなアクションを取りますか?
Tarianは、リスクを軽減するために、実行中のPodを自己破壊し、ボリューム上のファイルを削除します。マルウェアやウイルスが環境全体に拡散した場合のリスクはご存じの通りです。そのため、TarianはPodを破壊することで可能な限りリスクを軽減するように設計されています。新しいPodのプロビジョニングは、Kubernetesの仕組みによって自動的に行われます。TarianはPodの破壊のみを行い、その破壊はTarianコントローラで事前にアクションを設定するか、オンデマンドでTarianに指示した場合のみ実行されます。アクションを実行したくない場合は、設定やトリガーは不要で、単に通知するだけにすることもできます。Tarianは基本的に、リスク軽減のためにユーザーが望むことを実行します。
すでにFalco、Kube-Hunter、Kube-Bench、Calico Enterprise Securityなど、ネットワークレベル、インフラレベル、アプリケーションレベルで脅威を検出・防止できる多くのセキュリティツール(オープンソースおよび商用)が存在する中で、なぜまた新しいセキュリティツールが必要なのか?なぜTarianなのか?
上記で述べたように、Tarianが生まれた主な理由は、コミュニティとしてKubernetesの脅威と共に戦うためです。もう一つの理由として、セキュリティの各層を突破し、ランタイムアプリケーションやストレージボリュームに到達し、インフラやデータを破壊・ロックするような高度な攻撃が存在する場合、どう対処するか?特にランサムウェアに発展するような攻撃に対して、どのようなアクションを取りたいか?Tarianは、アクションを実行することでそのようなリスクを軽減するために設計されています。Tarianが究極のソリューションではないことは承知していますが、コミュニティによる継続的な知識共有と、技術的な観点から感染リソースを破壊することでリスク軽減に貢献できると確信しています。
一部のセキュリティ専門家と既に話をしており、まだいくつかの議論が残っていますが、設計図は確定次第公開します。
kubectl create namespace tarian-system
helm install tarian-postgresql bitnami/postgresql -n tarian-system \
--set postgresqlUsername=postgres \
--set postgresqlPassword=tarian \
--set postgresqlDatabase=tarian
helm repo add tarian https://devopstoday11.github.io/tarian
helm repo update
helm install tarian-server tarian/tarian-server --devel -n tarian-system
helm install tarian-cluster-agent tarian/tarian-cluster-agent --devel -n tarian-system
kubectl wait --for=condition=ready pod --all -n tarian-system
kubectl exec -ti deploy/tarian-server -n tarian-system -- ./tarian-server db migrate
helm chartの値については以下を参照してください。
kubectl port-forward svc/tarian-server -n tarian-system 41051:80
export TARIAN_SERVER_ADDRESS=localhost:41051
tarianctl get events
tarianctl add constraint --name nginx --namespace default \
--match-labels run=nginx \
--allowed-processes=pause,tarian-pod-agent,nginx
tarianctl get constraints
tarianctl add constraint --name nginx-files --namespace default \
--match-labels run=nginx \
--allowed-file-sha256sums=/usr/share/nginx/html/index.html=38ffd4972ae513a0c79a8be4573403edcd709f0f572105362b08ff50cf6de521
tarianctl get constraints
制約を作成した後、アノテーションを追加してtarian-pod-agentをPodに注入します。
metadata:
annotations:
pod-agent.k8s.tarian.dev/threat-scan: "true"
このアノテーションが付いたPodには、追加のコンテナ(tarian-pod-agent)が注入されます。tarian-pod-agentコンテナは、登録された制約に基づいてランタイム環境を継続的に検証します。違反が検出されると報告され、tarianctl get eventsで確認できます。
kubectl apply -f https://raw.githubusercontent.com/devopstoday11/tarian/main/dev/config/monitored-pod/configmap.yaml
kubectl apply -f https://raw.githubusercontent.com/devopstoday11/tarian/main/dev/config/monitored-pod/pod.yaml
# Readyになるのを待つ
kubectl wait --for=condition=ready pod nginx
# 未知のプロセスをシミュレート
kubectl exec -ti nginx -c nginx -- sleep 15
# tarianで報告されていることを確認
tarianctl get events
TarianにはデフォルトでPrometheus Alert Managerが含まれています。別のAlert Managerインスタンスを使用する場合は、以下のように設定します。
helm install tarian-server tarian/tarian-server --devel \
--set server.alert.alertManagerAddress=http://alertmanager.monitoring.svc:9093 \
--set alertManager.install=false \
-n tarian-system
無効にするには、alertManagerAddressの値を空に設定します。
docs/falco-integration.md を参照してください。
docs/troubleshooting.md を参照してください。
tarian-pod-agentが登録モードで実行されている場合、未知のプロセスやファイルを違反として報告する代わりに、自動的に新しい制約として登録します。これにより、手動で登録する手間が省けます。
制約登録を有効にするには、cluster-agentを設定する必要があります。
helm install tarian-cluster-agent tarian/tarian-cluster-agent --devel -n tarian-system \
--set clusterAgent.enableAddConstraint=true
metadata:
annotations:
# プロセスとファイルチェックサムの両方を登録
pod-agent.k8s.tarian.dev/register: "processes,files"
# 自動登録から特定のパスを除外
pod-agent.k8s.tarian.dev/register-file-ignore-paths: "/usr/share/nginx/**/*.txt"
自動制約登録は、開発/ステージングクラスターでも実行できるため、本番環境での変更が少なくなります。
metadata:
annotations:
# tarian-pod-agentがファイルチェックサムを確認する間隔を指定
pod-agent.k8s.tarian.dev/file-validation-interval: "1m"