macでGPGを使う

GPGのインストール

Homebrewを使ってGPGをインストールします。

brew install gnupg

GPGキーの作成

暗号化に使うためのGPGキーを作成していない場合は、以下のコマンドで新しいキーを作成します。

gpg --full-generate-key
  1. 暗号化タイプの選択 (RSAやECDSAなどを選択。基本的にはデフォルトでOK)

  2. キーの長さを指定 (通常は2048や4096を推奨)

  3. 有効期限を設定 (必要に応じて設定、無期限なら「0」を入力)

  4. 名前、メールアドレス、コメントを入力 (特に決まっていない場合は自分の情報を入力)

  5. パスフレーズの設定 (重要です。キーを守るための強力なパスフレーズを入力)

ファイルを暗号化する手順

暗号化したいファイル(例えば secret.txt)を用意します。 次のコマンドを使って、そのファイルをGPGで暗号化します。

gpg --output secret.txt.gpg --encrypt --recipient "あなたのメールアドレス" secret.txt
  • –output secret.txt.gpg: 出力する暗号化されたファイル名を指定。
  • –encrypt: ファイルを暗号化するオプション。
  • –recipient “あなたのメールアドレス”: 暗号化を解除できるユーザー(自分のメールアドレス)を指定。

暗号化されたファイルの復号

復号する際は、次のコマンドを使います。

gpg --output secret.txt --decrypt secret.txt.gpg

これにより、暗号化された secret.txt.gpg ファイルを復号して元の secret.txt に戻すことができます。

メモ

  • もし複数の公開鍵がある場合、適切な公開鍵が自分のものか確認し、–recipient オプションに正しい鍵(自分のもの)を指定してください。
  • 暗号化後は、元のファイル(平文の secret.txt)を削除して、セキュリティを高めることをお勧めします。

AWSの認証情報を保存したい(docker-credential-passがgnupgを使っている)

mac OSでDockerを使う場合、通常は docker-credential-osxkeychain に認証情報が保存される が、dockerコンテナ内で作業している場合は、コンテナの外にある docker-credential-osxkeychain は使えない(使用しているライブラリもコンテナとホストOSで違うので、そのままでは動作しないだろう) 私は作業用コンテナにUbuntuのイメージを使っている。この場合、下記の選択肢が取れそう、passの方が一般的のようだったのでこちらを導入した(内部的にgnupgを利用する)

  • docker-credential-pass
  • docker-credential-secretservice(GNOME Keyring を利用)

コンテナ内でもawsの認証情報を使えるようにするための設定をまとめた

1. 必須パッケージをインストール

apt-get update
apt-get install -y gnupg gpg-agent pass pinentry-curses dirmngr

2. GnuPG の準備

# GnuPGホームディレクトリ作成
mkdir -p ~/.gnupg
chmod 700 ~/.gnupg

/run/user配下にディレクトリを作成する権限が無い場合、rootが作成し、所有者情報、権限をユーザに合わせる必要がある

# GPG エージェント用ソケット置き場
export XDG_RUNTIME_DIR=/run/user/$(id -u)
mkdir -p "$XDG_RUNTIME_DIR"
chmod 700 "$XDG_RUNTIME_DIR"
# 端末設定(pinentry のため)
export GPG_TTY=$(tty)

# keyboxd を避ける(安定用)
echo 'no-use-keyboxd' >> ~/.gnupg/gpg.conf
echo 'allow-loopback-pinentry' >> ~/.gnupg/gpg-agent.conf

3. GPG キーを生成

対話的に作成:

gpg --full-generate-key

非対話で作成(例: 1年有効):

gpg --quick-generate-key "docker-pass <docker@example>" default default 1y

4. KEYID の確認

gpg --list-secret-keys --keyid-format=long

5. pass を初期化

pass init <KEYID か フィンガープリント>

pass ls で確認( 初期化直後は「Password Store」だけ表示されればOK )

6. Docker 設定

{
  "credsStore": "pass",
  "auths": {}
}

7. ECR にログイン

aws ecr get-login-password --region ap-northeast-1 \
| docker login --username AWS --password-stdin <AWS ID>.dkr.ecr.ap-northeast-1.amazonaws.com

補足

pass の保存先は ~/.password-store。内容は GPG で暗号化されている。 ホストとコンテナで使い回したい場合は以下をボリュームマウントすると便利:

-v $HOME/.gnupg:/root/.gnupg \
-v $HOME/.password-store:/root/.password-store \
-v $HOME/.docker:/root/.docker

GPG_TTY は常に設定しておくと安定する。