やること
- Prisma Cloudの開始
- Defender AgentをMinikubeにインストール
- Auth0(SAML IdP)でSSO + JITP
Prisma Cloud
https://www.paloaltonetworks.jp/prisma/cloud より
Prisma Cloudにより、ハイブリッド環境やマルチクラウド環境全体にわたってインフラストラクチャ、アプリケーション、データを保護
CWPPの定義
改めて知るCWPP(Cloud Workload Protection Platform)とは何か? より
Gartnerでは「2021 Gartner Market Guide for CWPP」の中で、CWPPを以下のように定義しています。
"workload-centric security products that protect server workloads in hybrid, multicloud data center environments."
様々なクラウド環境におけるサーバワークロードを保護する、ワークロード中心のセキュリティ製品ということですが、上記でワークロードの種別をご紹介したとおり、ワークロード自体も多様になっていますので、「多様なクラウド環境における多様なワークロードに対して一貫した可視化とコントロールができること」がCWPPの果たすべき役割だと考えています。クラウド環境自体もハイブリッドクラウド・マルチクラウド化が進んできていますので、これらにシームレスに対応できるかも重要なポイントです。
また、クラウドネイティブなアプリケーション環境においては、開発パイプラインの中で事前にワークロードに含まれ得るリスク(脆弱性やコンプライアンス違反等)をスキャンできることも重要になります。この点は特に、多くの企業にとって従来型のサーバ向けセキュリティ製品と大きく位置づけが異なると感じられるポイントではないかと思います。
CWPPが提供する機能
- Development Scanning(開発段階でのスキャン)
- コンポーネントに含まれる脆弱性
- クラウド設定状況
- シークレットの含有状況
- マルウェアの含有状況
- API
- Runtime Protection(ランタイム保護)
- コンポーネントに含まれる脆弱性
- クラウド設定状況
- シークレットの含有状況
- マルウェアの含有状況
- API
はじめる
- AWS Marketplaceから利用開始できる。
- SaaS形式なので、EC2が立ち上がったりはしない。
- 15日間は無料らしい。
アカウント作成後の初回ログイン
Defenderのインストール
Compute > Defenders > Deploy > Defenders
設定値を入れる。(OpenShiftで使うときは色々変えないとね。)
- Deployment method -> Orchestrator
- Choose the orchestrator type -> Kubernetes
- The name that Defender will use to connect to this Console -> 変更なし
- Specify a proxy for the defender -> Off
- Assign globally unique names to Hosts -> Off
- Specify a cluster name -> minikube
- Enter the namespace of the Defender Daemon Set -> twistlock
- NodeSelector -> 空欄
- Specify a custom docker socket path -> 空欄
- Monitor service accounts -> On
- Minitor Istio -> On
- Collect Deployment and Namespace labels -> Off
- Use the official Twistlock registry -> On
- Deploy Defenders with SELinux Policy -> Off
- Run Defenders as privileged -> Off
- Nodes use Container Runtime Interface (CRI), not Docker -> Off
- Nodes run inside containerized environment -> Off
- Install the Defender Daemon Set in the Kubernetes cluster using one of the following options: -> YAML
以下のYAMLがゲットできる。
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: twistlock-view
rules:
- apiGroups: ["rbac.authorization.k8s.io"]
resources: ["roles", "rolebindings", "clusterroles", "clusterrolebindings"] # Allow Defenders to list RBAC resources
verbs: ["list"]
- apiGroups: ["security.istio.io"]
resources: ["authorizationpolicies", "peerauthentications"] # Allow Defenders to list Istio security resources
verbs: ["list"]
- apiGroups: ["networking.istio.io"]
resources: ["virtualservices", "destinationrules", "gateways"] # Allow Defenders to list Istio networking resources
verbs: ["list"]
- apiGroups: [""] # "" indicates the core API group
resources: ["pods", "endpoints", "services"] # Allow Defenders to list pods, services and endpoints
verbs: ["list"]
- apiGroups: [""] # "" indicates the core API group
resources: ["pods/proxy"] # Allow Defenders to get pod proxy
verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: twistlock-view-binding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: twistlock-view
subjects:
- apiGroup:
kind: ServiceAccount
name: twistlock-service
namespace: twistlock
---
---
apiVersion: v1
kind: Secret
metadata:
name: twistlock-secrets
namespace: twistlock
type: Opaque
data:
...snip...
---
apiVersion: v1
kind: ServiceAccount # Service Account is used for managing security context constraints policies in Openshift (SCC)
metadata:
name: twistlock-service
namespace: twistlock
secrets:
- name: twistlock-secrets
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: twistlock-defender-ds
namespace: twistlock
spec:
selector:
matchLabels:
app: twistlock-defender
template:
metadata:
annotations:
container.apparmor.security.beta.kubernetes.io/twistlock-defender: unconfined
labels:
app: twistlock-defender
spec:
serviceAccountName: twistlock-service
restartPolicy: Always
containers:
- name: twistlock-defender
image: registry-auth.twistlock.com/tw_oqaszoiyuey3cfd4hodmxu1sytzgbeiy/twistlock/defender:defender_22_01_880
volumeMounts:
- name: data-folder
mountPath: "/var/lib/twistlock"
- name: certificates # Setting the certificates mount after data-folder since it is nested and was overridden in CRI based GKE cluster
mountPath: "/var/lib/twistlock/certificates"
- name: docker-sock-folder
mountPath: "/var/run"
- name: passwd
mountPath: "/etc/passwd"
readOnly: true
- name: syslog-socket
mountPath: "/dev/log"
env:
- name: WS_ADDRESS
value: wss://australia-southeast1.cloud.twistlock.com:443
- name: DEFENDER_TYPE
value: daemonset
- name: DEFENDER_LISTENER_TYPE
value: "none"
- name: LOG_PROD
value: "true"
- name: SYSTEMD_ENABLED
value: "false"
- name: DOCKER_CLIENT_ADDRESS
value: "/var/run/docker.sock"
- name: DEFENDER_CLUSTER_ID
value: "...snip..."
- name: DEFENDER_CLUSTER
value: "minikube"
- name: MONITOR_SERVICE_ACCOUNTS
value: "true"
- name: MONITOR_ISTIO
value: "true"
- name: COLLECT_POD_LABELS
value: "false"
- name: INSTALL_BUNDLE
value: "...snip..."
- name: HOST_CUSTOM_COMPLIANCE_ENABLED
value: "false"
- name: CLOUD_HOSTNAME_ENABLED
value: "false"
securityContext:
readOnlyRootFilesystem: true
privileged: false
capabilities:
add:
- NET_ADMIN # Required for process monitoring
- NET_RAW # Required for iptables (CNNF, runtime DNS, WAAS). See: https://bugzilla.redhat.com/show_bug.cgi?id=1895032
- SYS_ADMIN # Required for filesystem monitoring
- SYS_PTRACE # Required for local audit monitoring
- SYS_CHROOT # Required for changing mount namespace using setns
- MKNOD # A capability to create special files using mknod(2), used by docker-less registry scanning
- SETFCAP # A capability to set file capabilities, used by docker-less registry scanning
- IPC_LOCK # Required for perf events monitoring, allowing to ignore memory lock limits
resources: # See: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/#how-pods-with-resource-requests-are-scheduled
limits:
memory: "512Mi"
cpu: "900m"
requests:
cpu: "256m"
volumes:
- name: certificates
secret:
secretName: twistlock-secrets
defaultMode: 256
- name: syslog-socket
hostPath:
path: "/dev/log"
- name: data-folder
hostPath:
path: "/var/lib/twistlock"
- name: passwd
hostPath:
path: "/etc/passwd"
- name: docker-sock-folder
hostPath:
path: "/var/run"
hostPID: true
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
---
apiVersion: v1
kind: Service # Expose the Defender as admission controller. Remark: by default, Defender will not listen on the service port
metadata:
name: defender
namespace: twistlock
labels:
app: twistlock-defender
spec:
ports:
- port: 443
targetPort: 9998
selector:
app: twistlock-defender
ns作って、yamlを放り込む。
$ kubectl create ns twistlock
namespace/twistlock created
$ kubectl -n twistlock apply -f ./defender.yaml
clusterrole.rbac.authorization.k8s.io/twistlock-view created
clusterrolebinding.rbac.authorization.k8s.io/twistlock-view-binding created
secret/twistlock-secrets created
serviceaccount/twistlock-service created
daemonset.apps/twistlock-defender-ds created
service/defender created
$ kubectl -n twistlock get pod
NAME READY STATUS RESTARTS AGE
twistlock-defender-ds-gcjh9 1/1 Running 0 81s
Compute > Radars > Containers
でなにか見えるようになる。(bookinfoばかり適当に突っ込んだ残骸が見える)
散策
Radar > Hosts
Radar > Containers
Monitor > Runtimes
Monitor > Vulnerabilities
Monitor > Compliance
SAML SSO + JITP
Auth0でSAMLでSSOする。
Auth0側では、Addon: SAML2 Web Appを有効にして、
Callback URLをhttps://api.anz.prismacloud.io/saml
にする。
Prisma Cloud側では、Settings > Access Control > SSO に行く。設定を入れる。
JITPするが、ここでは動作確認だけするので、Auth0側の既定の属性セットを無理やり設定する。
- Enable SSO > On
- Audience URI -> 変更なし
- Identity Provider Issuer -> urn:thousandth.auth0.com
- Identity Provider Logout URL -> 空欄
- Certificate -> Auth0からDLしたPEMを貼る
- Prisma Cloud Access SAML URL -> 空欄
- Relay State Param Name -> 空欄
- Enforce DNS resolution for Prisma Cloud Access SAML URL -> Off
- Enable JIT Provisioning -> On
- Email -> http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress
- Role -> http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier
- First Name -> http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name
- Last Name -> http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn
- Allow select users to authenticate directly with Prisma Cloud -> アカウント登録時のメールアドレス
ログイン試行するユーザのnameidentifierでRoleを作っておく。
Auth0側のSettingsを以下のように変更。
{
{
"audience": "https://app.anz.prismacloud.io/customer/7eb ...snip... e70",
"nameIdentifierProbes": [
"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"
]
}
IdP Initiated SSOして、JITPもでてきて、RoleへのBindingも成功した。
Read Onlyも効いてそう。
JITPでのRole Bindingについて
- Prisma Cloudで予め作ったRoleにBindingする仕様
- 「Assertionに含まれる属性値がAだったら、RoleはX」みたいな読み替えはできない。RoleでBindすると定義した属性値がそのままRoleになる。(たぶん)
- ただ、Prisma CloudはRoleのスイッチが可能。複数RoleへのBindingをJITP時にやるにはどうしたらええんやろ。
自分用メモ
- System AdminはSAML対象のユーザではないので、違うブラウザのPassword Credentialを用いてログインすること。