WAL-E で PostgreSQL の Backup / Restore

PostgreSQL の Backup / Restore ツールとして heroku で開発されたとされる WAL-E がある。
フィジカル(物理)バックアップと WAL のアーカイブを S3 互換のオブジェクトストレージや Azure BLOB Storage や Google Cloud Storage へ保存でき、そこからのリストアもできる便利ツールです。

AWS で EC2 上の PostgreSQL のバックアップ/リストアを WAL-E で行ってみます。OS は Ubuntu 14.04 (Trusty) を使います。
"WAL-E で PostgreSQL の Backup / Restore"の続きを読む

Acmesmith で証明書発行を試す – その3

過去2回 Acmesmith を filesystem, S3 を storage として試してきました。

Acmesmith で証明書発行を試す - その1 (filesystem)
Acmesmith で証明書発行を試す - その2 (S3)

証明書の秘密鍵はセキュアな管理がが必要なので KMS (Key Management Service) を使って S3 に保存することを試してみます。

まずは AWS の IAM Console にある「Encryption Keys(暗号化キー)」にてキーを作成します(リージョンに注意しましょう)。
作成時の設定でキーの利用者に Acmesmith で使う IAM ユーザーを指定しておきます(後からでも設定可能です)。

後は key id (11111111-2222-3333-4444-555555555555 みたいなやつ)を acmesmith.yml に設定するだけです。

endpoint: https://acme-v01.api.letsencrypt.org/

storage:
  type: s3
  bucket: BUCKET-NAME
  region: ap-northeast-1
  use_kms: true
  kms_key_id: 11111111-2222-3333-4444-555555555555

challenge_responders:
  - route53: {}

account_key_passphrase:
certificate_key_passphrase:

kms_key_id だけを設定しておくと account.pem (Let's Encrypt のアカウント用秘密鍵)も証明書用の秘密鍵もこの KMS キーで暗号化されます。kms_key_id_accountkms_key_id_certificate_key をそれぞれ別のキーに設定すると別々のキーで暗号化されます。証明書の秘密鍵はダウンロードさせるけど Let's Encrypt へのアクセスは権限を分けたいと行った場合に使えそうです。勝手に Revoke されないようにとか。

acmesmith.yml の準備ができたらこれまでと同様に register, authorize, request すれば証明書がゲットできます。

S3 Console で詳細を確認すると「サーバー側の暗号化: AWS KMS マスターキーの使用: acmetest」と表示されていました。暗号化されているようです。サーバーサイド暗号となっているのでキーへのアクセス権あれば透過的に扱えます。コンソールからダウロードしたらデコードされています。

account.pem

cert.pem, chain.pem, fullchain.pem, key.pem が作成されますが暗号の必要な key.pem だけが暗号化されています。

certs

使うだけじゃなくて revoke とか renew とかのコマンド追加の PR ができれば

(2016/06/10 追記)
私なんかがやらなくてもどんどん改善されてました
0.4.0 での help はこんな出力
0.3.0 で autorenew や add-san が追加され、0.4.0 では save-pkcs12 が追加されてます

$ bundle exec acmesmith help
Commands:
  acmesmith add-san COMMON_NAME [ADDITIONAL_SANS]       # request renewal of ...
  acmesmith authorize DOMAIN                            # Get authz for DOMAIN.
  acmesmith autorenew                                   # request renewal of ...
  acmesmith current COMMON_NAME                         # show current versio...
  acmesmith help [COMMAND]                              # Describe available ...
  acmesmith list [COMMON_NAME]                          # list certificates o...
  acmesmith register CONTACT                            # Create account key ...
  acmesmith request COMMON_NAME [SAN]                   # request certificate...
  acmesmith save-certificate COMMON_NAME --output=PATH  # Save certificate to...
  acmesmith save-pkcs12 COMMON_NAME --output=PATH       # Save ceriticate and...
  acmesmith save-private-key COMMON_NAME --output=PATH  # Save private key to...
  acmesmith show-certificate COMMON_NAME                # show certificate
  acmesmith show-private-key COMMON_NAME                # show private key

Options:
  -c, [--config=CONFIG]                                    
                                                           # Default: ./acmesmith.yml
  -E, [--passphrase-from-env], [--no-passphrase-from-env]  # Read $ACMESMITH_ACCOUNT_KEY_PASSPHRASE and $ACMESMITH_CERTIFICATE_KEY_PASSPHRASE for passphrases

Acmesmith で証明書発行を試す – その2

前回「Acmesmith で証明書発行を試す - その1」で で filesystem に保存する方法を試してみました。

今回は AWS S3 に保存するテストを行ってみます。KMS はまだ使いません。bucket 名は BUCKET-NAME として進めます。

aws s3 コマンドでも操作できるように IAM policy を設定します。README に書いてある policy には s3:GetBucketLocation がないために aws s3 コマンドではアクセスできませんでした。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:GetBucketLocation"
      ],
      "Resource": "arn:aws:s3:::BUCKET-NAME"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:DeleteObject"
      ],
      "Resource": "arn:aws:s3:::BUCKET-NAME/*"
    }
  ]
}

acmesmith.sh の storage を S3 用に書き換えます。
認証情報は aws-cli の ~/.aws/credentials を使うのでここには書きません。region~/.aws/config の値は使われないので指定が必要です。

endpoint: https://acme-v01.api.letsencrypt.org/

storage:
  type: s3
  bucket: BUCKET-NAME
  region: ap-northeast-1
  use_kms: false

challenge_responders:
  - route53: {}

account_key_passphrase:
certificate_key_passphrase:

前回作成したアカウントの account.pem が手元にあるのでこれを S3 にコピーしておきます。(新たに作成 (register) しても問題ありません)

$ aws s3 cp account.pem s3://BUCKET-NAME/account.pem
$ aws s3 ls s3://BUCKET-NAME/
2016-02-07 17:28:05       1679 account.pem

後は同じですね。

$ bundle exec acmesmith authorize www2.teraoka.me
$ bundle exec acmesmith request www2.teraoka.me
$ aws s3 ls s3://BUCKET-NAME/
                           PRE certs/
2016-02-07 17:28:05       1679 account.pem
$ aws s3 ls s3://BUCKET-NAME/certs/
                           PRE www2.teraoka.me/
$ aws s3 ls s3://BUCKET-NAME/certs/www2.teraoka.me/
                           PRE 20160207-032600_***********************************/
2016-02-07 13:25:50         51 current
$ aws s3 ls s3://BUCKET-NAME/certs/www2.teraoka.me/20160207-032600_***********************************/
2016-02-07 13:25:49       1797 cert.pem
2016-02-07 13:25:50       1675 chain.pem
2016-02-07 13:25:50       3472 fullchain.pem
2016-02-07 13:25:50       1679 key.pem

次回は KMS (Key Management Service)試します