POSTGRES_PASSWORD 被忽略,无需或使用任何密码都可以访问数据库

soc*_*pet 7 postgresql docker kubernetes skaffold

正如标题所示,我正在设置一个,POSTGRES_PASSWORD在使用 Skaffold 启动集群后(--port-forward这样我就可以使用 pgAdmin 访问数据库),我可以使用或不使用正确的密码访问数据库。POSTGRES_DB并按POSTGRES_USER预期工作。

我在 Docker Hub for Postgres 的文档中看到:

注 1:PostgreSQL 映像在本地设置身份验证,因此您可能会注意到从(在同一容器内)trust连接时不需要密码。localhost但是,如果从不同的主机/容器连接,则需要密码。

我认为这--port-forward可能是罪魁祸首,因为它注册为localhost.

无论如何要防止这种行为?

我想担心的是有人可以访问我的笔记本电脑并轻松连接到数据库。

这是我的postgres.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      component: postgres
  template:
    metadata:
      labels:
        component: postgres
    spec:
      containers:
        - name: postgres
          image:testproject/postgres
          ports:
            - containerPort: 5432
          env: 
            - name: POSTGRES_DB
              value: dev
            - name: POSTGRES_USER
              value: dev
            - name: POSTGRES_PASSWORD
              value: qwerty
          volumeMounts:
            - name: postgres-storage
              mountPath: /var/lib/postgresql/data
              subPath: postgres
      volumes:
        - name: postgres-storage
          persistentVolumeClaim:
            claimName: postgres-storage
---
apiVersion: v1
kind: Service
metadata:
  name: postgres-cluster-ip-service
spec:
  type: ClusterIP
  selector:
    component: postgres
  ports:
    - port: 5432
      targetPort: 5432
Run Code Online (Sandbox Code Playgroud)

还有skaffold.yaml

apiVersion: skaffold/v1beta15
kind: Config
build:
  local:
    push: false
  artifacts:
    - image: testproject/postgres
      docker:
        dockerfile: ./db/Dockerfile.dev
      sync:
        manual:
          - src: "***/*.sql"
            dest: .
    - image: testproject/server
      docker:
        dockerfile: ./server/Dockerfile.dev
      sync:
        manual:
          - src: "***/*.py"
            dest: .
deploy:
  kubectl:
    manifests:
      - k8s/ingress.yaml 
      - k8s/postgres.yaml
      - k8s/server.yaml
Run Code Online (Sandbox Code Playgroud)

Dockerfile.dev

FROM postgres:11-alpine
EXPOSE 5432
COPY ./db/*.sql /docker-entrypoint-initdb.d/
Run Code Online (Sandbox Code Playgroud)

soc*_*pet 6

好吧,重读postgresDocker 文档并发现了这一点:

POSTGRES_INITDB_ARGS

此可选环境变量可用于将参数发送到postgres initdb. 该值是一个空格分隔的参数字符串,正如postgres initdb预期的那样。这对于添加数据页校验和等功能很有用:-e POSTGRES_INITDB_ARGS="--data-checksums".

这让我看到了initdb文档

--auth=验证方法

该选项指定 pg_hba.conf 中使用的本地用户的身份验证方法(主机行和本地行)。除非您信任系统上的所有本地用户,否则请勿使用信任。trust 是默认值,以便于安装。

这让我看到了身份验证方法文档:

19.3.2。密码认证

基于密码的身份验证方法是md5password。这些方法的操作类似,只是通过连接发送密码的方式不同,即分别是 MD5 散列和明文。

如果您完全担心密码“嗅探”攻击,那么这md5是首选。如果可能的话password,应始终避免使用纯色。但是,md5不能与该功能一起使用db_user_namespace。如果连接受 SSL 加密保护,则可以安全地使用密码(尽管如果依赖使用 SSL,SSL 证书身份验证可能是更好的选择)。

PostgreSQL 数据库密码与操作系统用户密码是分开的。每个数据库用户的密码都存储在pg_authid系统目录中。可以使用 SQL 命令CREATE USER和来管理密码ALTER ROLE,例如CREATE USER foo WITH PASSWORD 'secret'。如果没有为用户设置密码,则存储的密码为空,并且该用户的密码验证将始终失败。

长话短说,我刚刚这样做了,现在只需要实际密码:

env: 
  ...
  - name: POSTGRES_INITDB_ARGS
    value: "-A md5"
Run Code Online (Sandbox Code Playgroud)