Polarisを試す

Polarisを試してみたメモ。

Polarisは3つのモードで実行が可能。

CLI

まずはコマンドラインツールを試す。

brew tap FairwindsOps/tap
brew install FairwindsOps/tap/polaris

適当なマニフェストを作成する。

k create deploy nginx --image=nginx --dry-run=client -o yaml > nginx.yaml

検査を実行する。デフォルトでディレクトリを指定するようになっている。

$ polaris audit --format=pretty --audit-path ./


Polaris audited Path ./ at 0001-01-01T00:00:00Z
    Nodes: 0 | Namespaces: 0 | Controllers: 1
    Final score: 46

Deployment nginx in namespace 
    hostIPCSet                           🎉 Success
        Security - Host IPC is not configured
    hostNetworkSet                       🎉 Success
        Security - Host network is not configured
    hostPIDSet                           🎉 Success
        Security - Host PID is not configured
  Container nginx
    runAsRootAllowed                     😬 Warning
        Security - Should not be allowed to run as root
    livenessProbeMissing                 😬 Warning
        Reliability - Liveness probe should be configured
    memoryLimitsMissing                  😬 Warning
        Efficiency - Memory limits should be set
    readinessProbeMissing                😬 Warning
        Reliability - Readiness probe should be configured
    cpuRequestsMissing                   😬 Warning
        Efficiency - CPU requests should be set
    privilegeEscalationAllowed           ❌ Danger
        Security - Privilege escalation should not be allowed
    pullPolicyNotAlways                  😬 Warning
        Reliability - Image pull policy should be "Always"
    runAsPrivileged                      🎉 Success
        Security - Not running as privileged
    cpuLimitsMissing                     😬 Warning
        Efficiency - CPU limits should be set
    dangerousCapabilities                🎉 Success
        Security - Container does not have any dangerous capabilities
    memoryRequestsMissing                😬 Warning
        Efficiency - Memory requests should be set
    notReadOnlyRootFilesystem            😬 Warning
        Security - Filesystem should be read only
    tagNotSpecified                      ❌ Danger
        Reliability - Image tag should be specified
    hostPortSet                          🎉 Success
        Security - Host port is not configured
    insecureCapabilities                 😬 Warning
        Security - Container should not have insecure capabilities

ダッシュボード

マニフェストかHelmでインストールする。

helm repo add fairwinds-stable https://charts.fairwinds.com/stable
helm upgrade --install polaris fairwinds-stable/polaris --namespace polaris --create-namespace

ポートフォワードでダッシュボードにアクセスする。

kubectl port-forward --namespace polaris svc/polaris-dashboard 8080:80

こんな感じでクラスターのオーバービューが見られる。

f:id:sotoiwa:20210511185846p:plain

カテゴリ別の結果も見られる。

f:id:sotoiwa:20210511185910p:plain

Namespaceの各ワークロードの結果も見られる。

f:id:sotoiwa:20210511185933p:plain

ダッシュボードをクラスターで動かさなくても、クラスターへのアクセスを許可したコンテナをローカルで起動してダッシュボードにアクセスすることもできる。ただし、EKSだとIAMで認証するために少し工夫がいるかも知れない。

アドミッションコントローラー

チャートまたはマニフェストでデプロイする。クラスターにcert-managerが必要。

helm upgrade --install polaris fairwinds-stable/polaris --namespace polaris --create-namespace \
  --set webhook.enable=true --set dashboard.enable=false

Webhookが作成されている。

$ k get validatingwebhookconfiguration
NAME                                          WEBHOOKS   AGE
aws-load-balancer-webhook                     1          114d
cert-manager-webhook                          1          114d
gatekeeper-validating-webhook-configuration   2          4d23h
polaris-webhook                               1          91s
vpc-resource-validating-webhook               1          114d

先ほどのNginxのマニフェストで試す。ブロックされる。

$ k apply -f nginx.yaml 
Error from server (
Polaris prevented this deployment due to configuration problems:
- Container nginx: Privilege escalation should not be allowed
- Container nginx: Image tag should be specified
): error when creating "nginx.yaml": admission webhook "polaris.fairwinds.com" denied the request: 
Polaris prevented this deployment due to configuration problems:
- Container nginx: Privilege escalation should not be allowed
- Container nginx: Image tag should be specified

設定のカスタマイズconfig.yamlを渡すことで可能。