3

正如标题所说,我正在设置 aPOSTGRES_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

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

Dockerfile.dev太:

FROM postgres:11-alpine
EXPOSE 5432
COPY ./db/*.sql /docker-entrypoint-initdb.d/
4

1 回答 1

4

好的,重新postgres阅读 Docker 文档并遇到了这个问题:

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"
于 2019-12-06T04:56:26.757 回答