sighupio/gatekeeper-policy-manager
GitHub: sighupio/gatekeeper-policy-manager
一个轻量级的只读 Web UI,用于集中查看 Kubernetes 集群中 OPA Gatekeeper 策略的状态、违规情况和约束配置。
Stars: 328 | Forks: 38
Gatekeeper Policy Manager (GPM)
[](https://ci.sighup.io/sighupio/gatekeeper-policy-manager)



**Gatekeeper Policy Manager** 是一个简单的*只读* Web UI,用于查看 Kubernetes 集群中 OPA Gatekeeper 策略的状态。
目标 Kubernetes 集群可以是运行 GPM 的同一集群,也可以是[使用 `kubeconfig` 文件的其他远程集群](#multi-cluster-support)。您也可以在[本地客户端机器上](#running-locally)运行 GPM 并连接到远程集群。
GPM 可以显示所有已定义的 **Constraint Templates** 及其 rego 代码、所有的 Gatekeeper Configuration CRD,以及所有的 **Constraints** 及其当前状态、违规情况、执行动作和匹配定义等。
[您可以在下面查看一些截图](#screenshots)。
## 要求
您需要在集群中运行 OPA Gatekeeper,并且至少定义了一些约束模板和约束才能使用此工具。
## 部署 GPM
### 使用 Kustomize 部署
要将 Gatekeeper Policy Manager 部署到您的集群,请运行以下命令来应用提供的 [`kustomization`](kustomization.yaml) 文件:
```
kubectl apply -k .
```
默认情况下,这将在 `gatekeeper-system` 命名空间中创建一个名为 `gatekeper-policy-manager` 的部署和服务。我们建议您查看 `kustomization.yaml` 文件以进行进一步的配置。
部署应用程序后,如果您尚未设置 ingress,可以使用端口转发来访问 Web UI:
```
kubectl -n gatekeeper-system port-forward svc/gatekeeper-policy-manager 8080:80
```
然后在浏览器中访问:[http://127.0.0.1:8080](http://127.0.0.1:8080)
### 使用 Helm 部署
也可以使用[提供的 Helm Chart](./chart) 来部署 GPM。
首先创建一个值文件,例如 `my-values.yaml`,其中包含您的自定义发布值。有关更多信息,请参阅 [chart 的 readme](./chart/README.md) 和 [默认的 values.yaml](./chart/values.yaml)。
然后,执行:
```
helm repo add gpm https://sighupio.github.io/gatekeeper-policy-manager
helm upgrade --install --namespace gatekeeper-system --set image.tag=v1.1.1 --values my-values.yaml gatekeeper-policy-manager gpm/gatekeeper-policy-manager
```
## 本地运行
也可以使用 docker 和 `kubeconfig` 在本地运行 GPM,假设您要使用的 `kubeconfig` 文件位于 `~/.kube/config`,在本地运行 GPM 的命令如下:
```
docker run -v ~/.kube/config:/home/gpm/.kube/config -p 8080:8080 quay.io/sighup/gatekeeper-policy-manager:v1.1.1
```
然后在浏览器中访问:[http://127.0.0.1:8080](http://127.0.0.1:8080)
## 配置
GPM 是一个无状态应用程序,但可以通过环境变量进行配置。可能的配置如下:
| 环境变量名称 | 描述 | 默认值 |
| --------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------- |
| `GPM_SECRET_KEY` | 用于生成 token 的密钥。**在生产环境中请更改此值**。 | `g8k1p3rp0l1c7m4n4g3r` |
| `KUBECONFIG` | [kubeconfig](https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/) 文件的路径,如果在集群内部运行时提供此配置文件,将替代集群的 API 使用此配置文件。 |
| `GPM_LOG_LEVEL` | 日志级别(有关可用级别,请参阅 [python logging 文档](https://docs.python.org/2/library/logging.html#levels)) | `INFO` |
| `GPM_AUTH_ENABLED` | 启用身份验证,当前选项:“Anonymous”、“OIDC” | Anonymous |
| `GPM_PREFERRED_URL_SCHEME` | 生成链接时使用的 URL 方案。 | `http` |
| `GPM_OIDC_REDIRECT_DOMAIN` | 正在运行 GPM 的域。这是客户端在通过身份验证后将被重定向到的地址 | |
| `GPM_OIDC_CLIENT_ID` | 用于向 OIDC Provider 进行身份验证的 Client ID | |
| `GPM_OIDC_CLIENT_SECRET` | 用于向 OIDC Provider 进行身份验证的 Client Secret(可选) | |
| `GPM_OIDC_ISSUER` | OIDC Issuer 主机名(如果启用了 OIDC 身份验证则为必填) | |
| `GPM_OIDC_AUTHORIZATION_ENDPOINT` | OIDC Authorization Endpoint(可选,设置此参数将禁用对其余提供程序配置的自动发现,如果设置此项,也需设置所有其他值) | |
| `GPM_OIDC_JWKS_URI` | OIDC JWKS URI(可选,设置此参数将禁用对其余提供程序配置的自动发现,如果设置此项,也需设置所有其他值) | |
| `GPM_OIDC_TOKEN_ENDPOINT` | OIDC TOKEN Endpoint(可选,设置此参数将禁用对其余提供程序配置的自动发现,如果设置此项,也需设置所有其他值) | |
| `GPM_OIDC_INTROSPECTION_ENDPOINT` | OIDC Introspection Endpoint(可选,设置此参数将禁用对其余提供程序配置的自动发现,如果设置此项,也需设置所有其他值) | |
| `GPM_OIDC_USERINFO_ENDPOINT` | OIDC Userinfo Endpoint(可选,设置此参数将禁用对其余提供程序配置的自动发现,如果设置此项,也需设置所有其他值) | |
| `GPM_OIDC_END_SESSION_ENDPOINT` | OIDC End Session Endpoint(可选,设置此参数将禁用对其余提供程序配置的自动发现,如果设置此项,也需设置所有其他值) | |
### 多集群支持
当使用包含多个 context 的 `kubeconfig` 时,GPM 支持多集群。GPM 允许您直接从 UI 中选择 context。
如果您想在集群内运行 GPM 但又需要多集群支持,只需在 GPM 的 Pod 中挂载一个包含集群访问配置的 `kubeconfig` 文件,并将环境变量 `KUBECONFIG` 设置为挂载的 `kubeconfig` 文件的路径即可。或者您也可以直接将其挂载到 `/home/gpm/.kube/config`,GPM 会自动检测它。
在本地运行 GPM 时,您已经在使用 `kubeconfig` 文件连接到集群,现在您应该能看到所有已定义的 context。您可以在 UI 中轻松切换它们。
#### AWS IAM 身份验证
如果您想使用带有 IAM 身份验证的 Kubeconfig,则需要自定义 GPM 的容器镜像,因为 IAM 身份验证使用默认未包含在镜像中的外部 AWS 二进制文件。
您可以使用如下的 `Dockerfile` 自定义容器镜像:
```
FROM curlimages/curl:7.81.0 as downloader
RUN curl https://github.com/kubernetes-sigs/aws-iam-authenticator/releases/download/v0.5.5/aws-iam-authenticator_0.5.5_linux_amd64 --output /tmp/aws-iam-authenticator
RUN chmod +x /tmp/aws-iam-authenticator
FROM quay.io/sighup/gatekeeper-policy-manager:v1.1.1
COPY --from=downloader --chown=root:root /tmp/aws-iam-authenticator /usr/local/bin/
```
您可能还需要添加 `aws` CLI,可以使用与上述相同的方法。
确保您的 `kubeconfig` 的 `apiVersion` 设置为 `client.authentication.k8s.io/v1beta1`
您可以在[此 issue](https://github.com/sighupio/gatekeeper-policy-manager/issues/330) 中了解更多信息。
## 截图








## 开发
GPM 使用 Python 编写,后端采用 Flask 框架,前端采用带有 Elastic UI 和 Fury 主题的 React。
要开发 GPM,您需要创建一个 Python 3 虚拟环境,安装提供的 `requirements.txt` 中指定的所有依赖项,构建 React 前端,然后您就可以开始尽情开发了。
以下命令可帮助您启动并运行:
```
# 构建 frontend 并复制到 static 文件夹
$ pushd app/web-client
$ yarn install && yarn build
$ cp -r build/* ../static-content/
$ popd
# 创建 virtualenv
$ python3 -m venv env
# 激活它
$ source ./env/bin/activate
# 安装所有 dependencies
$ pip install -r app/requirements.txt
# 运行 development server
$ FLASK_APP=app/app.py FLASK_ENV=development flask run
```
如果您想实时测试前端的更改,请确保后端正在运行(见上文),然后使用 `yarn` 运行前端:
```
cd app/web-client
yarn start
```
此时应打开一个浏览器窗口,如果 React 应用无法连接到后端,请检查 `.env` 文件是否指向了正确的后端 endpoint(`REACT_APP_LOCAL_GPM_SERVER_URL`)。
## 路线图
以下是我们希望添加到 GPM 中的功能愿望清单(排名不分先后):
- [x] 列出当前正在使用 `ConstraintTemplate` 的约束
- [ ] 完善的 OIDC 身份验证
- [ ] LDAP 身份验证
- [x] 更好的 rego 代码片段语法高亮
- [x] 无 root 权限的 docker 镜像
- [x] 多集群视图
- [ ] 最小写入能力?
- [ ] 用 Golang 重写应用?(在 `feature/go-backend` 分支中进行中)
如果您正在使用 GPM,请通过在此 GitHub 上创建 issue 告知我们,并告诉我们您希望拥有哪些功能 💪🏻标签:Gatekeeper Policy Manager, Groq API, Helm, Kubeconfig, Kustomize, OPA Gatekeeper, Rego, TCP SYN 扫描, Web UI, 只读视图, 多集群支持, 子域名突变, 端口转发, 策略即代码, 策略可视化, 约束模板, 约束状态, 聊天机器人安全, 自动化攻击, 请求拦截, 运维工具, 逆向工具