docker

【危険】ローカルのDockerで立ち上げたPostgresにもパスワードを設定しよう

2022/07/17

背景

ネットで公開されているDockerでのPostgresの立ち上げには, パスワードが設定されていないことが多い.

ルーターの脆弱性などで意図せずグローバルからアクセスできてしまうことがあり, パスワードを設定していないと簡単にpostgresユーザを利用して, そのコンテナにマルウェアを感染させるなど悪戯することができる.
CVE-2019-9193: Not a Security Vulnerability

ローカルにデータがある状態でのパスワード設定

1. docker-compose.ymlの書き換え

よくある設定

ports:
  - "5432:5432"
environment:
  POSTGRES_PASSWORD: ""
  POSTGRES_HOST_AUTH_METHOD: trust

portsとenvironmentを書き換える

ports:
  - "127.0.0.1:5432:5432"
environment:
  POSTGRES_USER: "postgres"
  POSTGRES_PASSWORD: "複雑なパスワード"

2. バックアップを取る

$ pg_dumpall -h localhost -p 5432 -U postgres --exclude-database postgres | sed -E 's/^(CREATE|ALTER) ROLE/-- &/' > dump-$(date "+%Y%m%dt%H%M%S").sql

3. コンテナを作り直して, リストアする

# Dockerコンテナを落とす
$ docker compose down
# volume(Postgresのデータ)を削除する
$ docker volume rm [volume名]

# Postgresを起動する
$ docker compose up -d

# バックアップファイルが1つなことを確認
$ ls | grep '^dump-'
# バックアップSQLをローカルからdockerコンテナ内に移動させる
$ ls | grep '^dump-' | PGPASSWORD="複雑なパスワード" xargs -Ipath psql -h localhost -p 5432 -U postgres -f path

Twitterフォロー待ってます!