端到端全能加密平台 - Phase

k8s技术圈

共 11172字,需浏览 23分钟

 · 2023-11-12

Phase 是一个开源(核心)的端到端可自托管的全能加密平台,用于在你的基础架构中供开发人员管理秘钥和环境变量。

功能特性

  • 控制台:无缝创建、管理、轮换机密数据和环境变量的仪表盘
  • 保护您的密钥:通过24个单词的助记符短语保持自己的根密钥的自主性
  • 密钥管理:差异化、版本控制和时间点恢复
  • RBAC:每个应用程序、每个环境的细粒度、基于角色和密码的访问控制
  • 服务令牌:使用细粒度范围对CI运行器、构建工具和生产环境进行身份验证
  • 密码引用:继承密码以创建复杂的配置
  • 审计日志:对每个更改和访问事件完全可见
  • 自托管:在自己的基础设施上运行阶段
  • KMS:零知识密钥管理服务
  • SDK:使用几行代码加密/解密数据。

命令行工具

通过 Phase 的命令行工具可以在几秒钟之内将机密数据导入、加密并注入到你的应用程序中,无需修改任何代码。

# Your existing secrets
> cat .env
AWS_ACCESS_KEY_ID="AKIA2OGYBAH63UA3VNFG"
AWS_SECRET_ACCESS_KEY="V5yWXDe82Gohf9DYBhpatYZ74a5fiKfJVx8rx6W1"

# Import your existing secrets
> phase secrets import .env
Successfully imported and encrypted 2 secrets.
To view them please run: phase secrets list

# View your secrets in Phase
> phase secrets list
KEY 🗝️                    | VALUE ✨                                                                  
----------------------------------------------------------------------------------------------------     
AWS_ACCESS_KEY_ID        | AKI**************NFG                                                     
AWS_SECRET_ACCESS_KEY    | V5y**********************************6W1                                 

🥽 To uncover the secrets, use: phase secrets list --show

# Get rid of your .env
> rm .env

# Seamlessly inject secrets during runtime
> phase run yarn dev
$ next dev
ready - started server on 0.0.0.0:3000, url: http://localhost:3000
  • Phase CLI 命令行工具可以获取、解密秘密和环境变量并将其注入到您的应用程序中,不需要更改代码。
  • 注入
  • dotenv 格式导出机密数据
  • 跨平台:在 macOS、Ubuntu/Arch/Redhat/Alpine Linux、Windows、Docker 上轻松安装 Phase CLI。
  • Keyring 集成 - 将密钥和凭据安全地存储在 macOS 钥匙串、Windows Credential Locker、KDE 钱包、GNOME Keyring 等。
  • 私钥分片:通过秘密分割方案避免私钥的单点泄露

安装

最快、最可靠的开始方法是在 Phase Console 上创建一个新的免费帐户:https://console.phase.dev/。

为了满足各种合规要求或仅仅是为了保持对数据的控制,您可能希望自托管 Phase 而不是使用Phase云服务。当您在自己的基础架构上自托管 Phase 服务时,您将独自承担安全性、可靠性和可用性方面的责任。您需要设置有效的 TLS 证书、Web 应用防火墙、数据库备份和复制、DDoS 保护、速率限制、SSO 等。目前支持如下几种方式:

  • Docker Compose
  • AWS
  • Azure
  • Google Cloud Platform
  • DigitalOcean

最简单的用于演示测试的当然是使用 Docker Compose 了,我们也可以选择将 Phase 控制台组件运行于托管服务(PaaS)上,或者使用 Kubernetes 等替代的容器编排工具,而不是使用 Docker Compose。考虑将 Phase 服务部署在 VPN 或 VPC 后面,而不是直接暴露在互联网上。

1.安装Docker

# Ubuntu
sudo apt update && sudo apt upgrade -y && sudo apt install -y docker-compose

2.下载配置.env 模板:

wget -O .env https://raw.githubusercontent.com/phasehq/console/main/.env.example

Docker Compose 模板:

wget -O docker-compose.yml https://raw.githubusercontent.com/phasehq/console/main/docker-compose.yml

Nginx 配置:

mkdir nginx && wget -O ./nginx/default.conf https://raw.githubusercontent.com/phasehq/console/main/nginx/default.conf

Nginx Dockerfile:

wget -O ./nginx/Dockerfile  https://raw.githubusercontent.com/phasehq/console/main/nginx/Dockerfile

3.更新配置

根据自己的环境修改 .env 文件。**4.启动服务

docker-compose -f docker-compose.yml up -d

您的 Phase 控制台部署将在 https://localhost 上可用。默认情况下,Phase 将使用 nginx 提供自签名的 TLS 证书。在生产环境中,请使用有效的 TLS 证书。

使用

我们可以在很多平台集成使用 Phase。

Kubernetes

我们可以使用 Phase 在运行时将私密数据注入到您的应用程序进程中。无需更改任何代码或添加其他依赖项。可以通过内存中的初始化容器与 Kubernetes 工作负载轻松集成,并安全地注入密钥。

首先创建一个包含 PHASE_SERVICE_TOKEN 的 Secret 对象:

kubectl create secret generic phase-token --from-literal=PHASE_SERVICE_TOKEN=<YOUR_PHASE_SERVICE_TOKEN>

然后在 initContainer 中通过 CLI 容器来获取私密数据,如下所示:

apiVersion: v1
kind: Pod
metadata:
  name: alpine-pod
spec:
  volumes:
    - name: secrets-volume
      emptyDir:
        medium: Memory
  initContainers:
    - name: fetch-secrets
      image: phasehq/cli:latest
      volumeMounts:
        - name: secrets-volume
          mountPath: /secrets
      env:
        - name: PHASE_SERVICE_TOKEN
          valueFrom:
            secretKeyRef:
              name: phase-token
              key: PHASE_SERVICE_TOKEN
      command:
        - /bin/sh
        - -c
        - phase secrets export > /secrets/secrets.env
  containers:
    - name: alpine-main
      image: alpine:latest
      volumeMounts:
        - name: secrets-volume
          mountPath: /secrets
      command:
        - /bin/sh
        - -c
        - source /secrets/secrets.env && printenv

通过这种方式有很多优势:

  • 责任分离:初始化容器使您能够将设置环境的责任与主要容器的主要目的分开。通过仅使用初始化容器来获取密钥并填充内存卷,可以减少针对主应用程序的潜在攻击面。
  • 短暂性质:通过使用内存卷,数据不会在 Pod 的生命周期之外持久存在。当 Pod 终止时,数据将丢失。这降低了秘密数据被遗留下来的风险。
  • 无持久存储:由于获取的密钥并置于内存卷中的秘密数据不会写入任何持久存储,因此如果底层存储受到侵害或被不正确停用,它们不会被暴露出来的风险。

Jenkins

此外我们还可以使用 Phase CLI 轻松地在 CI 流水线或任务中注入或暴露密钥。比如下面的流水线代码我们将 Docker 的认证信息通过 Phase 来获取:

pipeline {
    agent any

    stages {
        stage('Prepare') {
            steps {
                sh 'curl -fsSL https://pkg.phase.dev/install.sh | bash'
                sh '''
                   phase secrets export --env prod DOCKERHUB_USERNAME DOCKERHUB_TOKEN
                   export $(phase secrets export --env prod DOCKERHUB_USERNAME DOCKERHUB_TOKEN | xargs)
                   '''

            }
        }

        stage('Build and Push') {
            steps {
                sh '''
                   docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_TOKEN
                   docker build -t my-image .
                   docker push my-image:latest
                   '''

            }
        }
    }
}

代码集成

同样我们还可以在很多应用程序开发框架中直接集成 Phase,使用 phase run 在运行时向应用程序过程中注入秘密。无需更改任何代码或增加任何依赖项。比如:

phase secrets list --show
KEY 🗝️                   | VALUE ✨
--------------------------------------------------------------------------------------
AWS_ACCESS_KEY_ID        | AKIA2OGYBAH6QLWOYDVN
AWS_SECRET_ACCESS_KEY    | 6ACbdYki5FISnaiWYZwwyQcAEcnKmNrULTCXw+RQ

比如对于 Django 应用我们可以使用下面的方法来进行集成:

在项目根目录下面初始化 phase:

phase init

使用 phase run 命令启动应用:

phase run python manage.py runserver payments-api:8000

还可以链接多个命令:**然后我们在应用程序中直接获取环境变量即可:

import os

AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')

Github仓库:https://github.com/phasehq/console

浏览 201
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报