セキュリティスキャン
クラスタのPod内部の脆弱性は、たとえあなたが作成したコンテナイメージであっても常に発生しうるものになってます。 例えば、Wordpressのフレームワークを使用しているコンテナはWordpressそのものに脆弱性が含まれるため、常に攻撃の危険にさらされるでしょう。
つまり、あなた自身のアプリケーションでもあなたが知らない脆弱性があり、その存在に気づく必要があります。 セキュリティスキャンはアプリケーションの脆弱性を発見するために、とくに本番稼働では必要なものになります。
Clair
Clairはインターネット上の脆弱性情報のデータベースから既知の脆弱性情報を取得して、PostgreSQLに格納するCoreOSのプロジェクトです。
実際に実行される前にコンテナイメージを統計的手法で分析し、安全ではないソフトウェアを検出します。
CICDパイプラインに組み込むことで、すべてのイメージをデプロイ前にテストすることも可能です
サンプルコード
ClairのデータベースとDockerコンテナをセットアップ
docker run -d --name clair-db arminc/clair-db:latest docker run -p 6060:6060 --link clair-db:postgres -d --name clair arminc/clair-local-scan:v2.0.8
import requests import json def scan_image(image_name): clair_url = "http://localhost:6060" layers_url = f"{clair_url}/v1/layers" analyze_url = f"{clair_url}/v1/analyze" # Get the layers of the Docker image response = requests.get(layers_url, params={"Name": image_name}) layers = json.loads(response.text) # Analyze each layer for layer in layers: layer_id = layer["Name"] requests.post(analyze_url, json={"LayerID": layer_id}) # Wait for the analysis to complete while True: analysis_status = requests.get(f"{analyze_url}/{image_name}").json() if analysis_status["Status"] == "Finished": break # Get the vulnerabilities found in the image vulnerabilities = requests.get(f"{analyze_url}/{image_name}").json()["Vulnerabilities"] return vulnerabilities if __name__ == "__main__": image_name = "your-docker-image:tag" # ここにスキャンしたいDockerイメージを指定してください vulnerabilities = scan_image(image_name) print("Vulnerabilities found:") for vuln in vulnerabilities: print(f"Severity: {vuln['Severity']}, Package: {vuln['Package']}, CVE: {vuln['Name']}")
Aqua security
脆弱性スキャナはClairだけではありません。Aqua security
も脆弱性スキャナとして機能します。
Clairとの違いはDockerfileに追加するだけで、セットアップが完了する点です。
ただし、無料版でもTOKENが必要になるので、GUIでの手続きは多少必要となります。
ADD https://get.aquasec.com/microscanner / RUN chmod +x microscanner RUN microscanner <TOKEN>