wataメモ

日々のメモをつらつらと書くだけ

踏み台サーバを作ってみた

 まだ全然足りないが、踏み台サーバを構築するプロビジョニングを作り始めてみた。 最初はbastionを作っていて、そこからサーバのプロビジョニングもあった方が良いなと始めて見た。 basionについてはRuby on Railsでサービスを作ってみたpart6で「踏み台サーバ」として簡単に紹介している。

 AWSを使っていて、良く踏み台サーバは作っているが意外と面倒くさい。 AMI化して共有しても良いのだが、「秘伝のAMIになるのも嫌だ」ということでItamaeで作成。 今は書きなぐっている状態なので、もう少しちゃんとcookbooks配下を整理して、リファクタリングしないといけない。

 もう少しちゃんと出来てきたら、全体をちゃんとこのメモでも記載する予定なので今回は証明書作成周り部分のメモ。

証明書の作成

 bastionを動かすためにnginxでhttpsを受けるように設定し、そこへアクセスする為にクライアント証明書が必要にする。 その為に以下を作成する。

  • CA用秘密鍵
  • CA用証明書
  • サーバ用秘密鍵
  • サーバ用公開鍵
  • サーバ用証明書
  • クライアント証明書

 基本opensslコマンドによって生成するが、基本対話式なのでここを自動化する必要があった。 基本パスワード周りなのでオプションで指定してく。

CA用秘密鍵の作成

# 対話式
openssl genrsa -des3 -out ca.key -rand rand.dat 2048
# 自動化
openssl genrsa -des3 -passout pass:#{pass} -out ca.key -rand rand.dat 2048

CA用証明書の作成

 パスワード以外にも色々な情報をsubjオプションで指定する。

# 対話式
openssl req -new -x509 -days 365 -key ca.key -out ca.crt
# 自動化
 openssl req -new -x509 -days 365 -key ca.key -passin pass:#{pass} -out ca.crt \
  -subj "/C=JP/ST=Tokyo/L=Chiyoda-Ku/O=/OU=/CN=/"

サーバ用秘密鍵の作成

# 対話式
openssl genrsa -des3 -out server.key -rand rand.dat 2048
# 自動化
openssl genrsa -des3 -passout pass:#{pass} -out server.key -rand rand.dat 2048

サーバ用公開鍵の作成

# 対話式
openssl req -new -key server.key -out server.csr
# 自動化
openssl req -new -key server.key -passin pass:#{pass} -out server.csr \
  -subj "/C=JP/ST=Tokyo/L=Chiyoda-Ku/O=/OU=/CN=#{node[:cert][:common_name]}/"

パスフレーズ削除

cp server.key server.key.bak
openssl rsa -in server.key.bak -passin pass:#{pass} -out server.key

サーバ用証明書の作成

 sign.shの部分はexpectを使って自動化。 生成にはautoexpectを利用。

# 対話式
mod_ssl-#{MOD_SSL_VER}/pkg.contrib/sign.sh server.csr
# 自動化
expect -f /home/webservice/make_cert.exp /home/webservice/mod_ssl-#{MOD_SSL_VER}/pkg.contrib/sign.sh server.csr

クライアント証明書の作成

 このシェルはbastion側にある。 これは自動化された方だけ紹介。

bastion/ccert/create
openssl genrsa -des3 -passout pass:$PASS -out ${USERS_DIR}/${USERNAME}.key 2048
openssl req -new -key ${USERS_DIR}/${USERNAME}.key -passin pass:$PASS -out ${USERS_DIR}/${USERNAME}.csr \
  -subj "/C=JP/ST=Tokyo/L=Chiyoda-Ku/O=/OU=/CN=${USERNAME}"
openssl x509 -req -days 1095 -passin pass:bastion -in ${USERS_DIR}/${USERNAME}.csr -CA $SSL_CERTS_DIR/ca.crt -CAkey $SSL_PRIVATE_DIR/ca.key -CAserial $SSL_DIR/serial -CAcreateserial -out ${USERS_DIR}/${USERNAME}.crt
openssl pkcs12 -export -clcerts -passin pass:$PASS -passout pass:$PASS -in ${USERS_DIR}/${USERNAME}.crt -inkey ${USERS_DIR}/${USERNAME}.key -out ${USERS_DIR}/${USERNAME}.p12