Edited at

Travis CIで複数の暗号化ファイルを扱う

More than 1 year has passed since last update.

Travis CIにはファイルを暗号化して秘密情報を公開リポジトリ上に安全に保存するような仕組みがあります。これはtravisコマンドのサブコマンドencrypt-fileで提供されており、下記のように利用します。

$ travis encrypt-file secret.txt

encrypting secret.txt for hnw/foobar
storing result as secret.txt.enc
storing secure env variables for decryption

Please add the following to your build script (before_install stage in your .travis.yml, for instance):

openssl aes-256-cbc -K $****_key -iv $****_iv -in secret.txt.enc -out secret.txt -d

Pro Tip: You can add it automatically by running with --add.

Make sure to add secret.txt.enc to the git repository.
Make sure not to add secret.txt to the git repository.
Commit all changes to your .travis.yml.

secret.txtを暗号化するとsecret.txt.encが生成されますので、これをGitリポジトリにcommitして利用します。指定されたopensslコマンドを.travis.yml内で利用することで、暗号化されたファイルを復号することができます。

このencrypt-fileでは公開鍵暗号の公開鍵を利用して暗号化が行われます1。公開鍵暗号の鍵ペアはTravis CIプロジェクトごとに作られており、公開鍵はAPI経由で誰でも確認できますが、秘密鍵はTravis CIしか知らないため、復号できるのはTravis CIだけという仕組みになっています。


travis encrypt-fileで複数ファイルの暗号化に対応する

ところで、travis encrypt-fileで複数ファイルを暗号化すると、最後に暗号化したファイルしか復号できません。

このことはTravis CIのマニュアルにも記載があり、必要ファイルをtarに固めて1ファイルにするというワークアラウンドが紹介されています。

ただ、これを素直に書くと.travis.ymlの記述が長々しくなるのが気持ち悪いと感じたので、使いやすくなるようなシェルスクリプトを書いてみました。


extract-encrypted-tar.sh

#! /usr/bin/env bash

set -eu

usage_exit() {
echo "Usage: $0 [-K AES_KEY] [-v AES_IV] encrypted-tar-file [patternes]" 1>&2
exit 1
}

while getopts K:iv:h OPT
do
case
$OPT in
K) AES_KEY=$OPTARG
;;
i)
;;
v) AES_IV=$OPTARG
;;
h) usage_exit
;;
\?) usage_exit
;;
esac
done

shift $((OPTIND - 1))

if [[ $# -eq 0 ]]; then
usage_exit
fi
if
[[ ! -v AES_KEY || ! -v AES_IV ]]; then
echo "Error: -K and -v are required options." 1>&2
usage_exit
fi

ENC_TAR=$1
shift
PATTERNS="$@"

raw_tar=$(mktemp -d /tmp/XXXXXXXXX)/secrets.tar

openssl aes-256-cbc -K $AES_KEY -iv $AES_IV -in $ENC_TAR -out $raw_tar -d
tar xf $raw_tar $PATTERNS
rm $raw_tar
rmdir $(dirname $raw_tar)


これを使うと次のように暗号化tarを展開できます。

./extract-encrypted-tar.sh -K $****_key -iv $****_iv secrets.tar.enc

また、tarのオプションを渡せるので、下記のような指定も可能です。

./extract-encrypted-tar.sh -K $****_key -iv $****_iv secrets.tar.enc .ssh/ -C $HOME

この程度の粒度の処理もシェルスクリプトにまとめると.travis.ymlの見通しが良くなるのでオススメです。





  1. 正確には256bit AES-CBCのKeyとIVを4096bit RSAの公開鍵で暗号化しています