softasap.sa_box_bootstap
以下のテキストを日本語に翻訳しました。わかりやすく、シンプルな表現を心がけました。
使用例:
シンプル
roles:
- {
role: "sa-box-bootstrap",
deploy_user: "{{jenkins_user}}",
deploy_user_authorized_keys: "{{jenkins_authorized_keys}}",
timezone: "Europe/Kiev"
}
高度な例
vars:
- root_dir: ..
- jenkins_user: jenkins
jenkins_authorized_keys:
- "{{playbook_dir}}/components/files/ssh/vyacheslav1.pub"
- "{{playbook_dir}}/components/files/ssh/vyacheslav2.pub"
- "{{playbook_dir}}/components/files/ssh/vyacheslav3.pub"
- "{{playbook_dir}}/components/files/ssh/vyacheslav4.pub"
- timezone: "Europe/Kiev"
pre_tasks:
- debug: msg="前処理タスクのセクション"
roles:
- {
role: "sa-box-bootstrap",
deploy_user: "{{jenkins_user}}",
deploy_user_key: "{{playbook_dir}}/components/files/ssh/jenkins_rsa",
deploy_user_pub_key: "{{playbook_dir}}/components/files/ssh/jenkins_rsa.pub",
deploy_user_authorized_keys: "{{jenkins_authorized_keys}}",
timezone: "Europe/Kiev",
option_copy_initial_authorized_keys: true,
option_enforce_ssh_keys_login: true,
option_file2ban: true,
option_firewall: true,
option_monit: true
}
重要: deploy_user_sudo_password
パラメーターを指定しない場合、作成されたデプロイメントユーザーはパスワード確認なしで sudo を実行できることになります。特定の状況では問題ありませんが、追加のセキュリティ層を持つことは常に良いことですので:
Sudo パスワードを要求するデプロイメントユーザー
vars:
- user_authorized_keys:
- "~/.ssh/id_rsa.pub"
- user_sudo_pass: "secret"
roles:
- {
role: "sa-box-bootstrap",
deploy_user: "slavko",
deploy_user_authorized_keys: "{{user_authorized_keys}}",
deploy_user_sudo_password: "{{user_sudo_pass | password_hash('sha512')}}",
option_enforce_ssh_keys_login: yes
}
Sudo パスワードを入力する必要があるデプロイメントユーザーがいる場合は、ansible_become_password
パラメーターを通じて提供する必要があります。
register
$BOX_PLAYBOOK
$BOX_NAME
$BOX_ADDRESS
$BOX_USER
$BOX_PWD
verbose 4
set box_address $BOX_ADDRESS
set ansible_become_password secret
provision $BOX_NAME
デプロイメントのためにボックスを準備する
背景
現在、デプロイメントはベアメタルサーバーからすぐに起動できる仮想マシンへ移行しています。AmazonやDigital Ocean、OpenStackベースのプロバイダーが提供するものです。したがって、ボックスの構成は手動の管理手順を必要としなくなりました。選択肢の一つは、すぐに使用できる事前構成済みのボックスイメージです。もう一つは、初期システムの再起動から始め、Ansible、Chef、Puppet などのプロビジョナーでプロジェクトのニーズに応じて構成する方法です。
カスタムプロビジョニングを進める最初のステップは、基本的なボックスのセキュリティを実施することです。特に新しくインストールされたボックスが root パスワードを持っている場合があります。
初期ボックスのセキュリティについて簡単なレシピを共有します。これはほとんどのウェブデプロイメントに適しています。
対処すべき課題
記事の最後には、Ubuntu 14.04 LTS の仮想サーバーをセキュリティを強化することができるようになります。
- ファイアウォールを設定し、22、443、80 ポートのみを許可します。
- デプロイユーザー用の公開鍵を登録します。
- SSHをセキュアにし、鍵による認証のみを許可します。
- インターネットからのオープンSSHポート愛好者を自動的にバンするプロセスを導入します。
ブートストラップボックスロール
Ansible は、デプロイメントスニペットの再利用という素晴らしいコンセプトを持っています。これをロールと呼びます。それでは、sa-box-bootstrap ロールが何をするのか見てみましょう。
構成オプション
以下の変数は上書きできます。
- root_dir - 必須、Ansible開発者レシピ リポジトリ
- option_enforce_ssh_keys_login (true|false) - SSHセキュリティを強化するかどうか
- ufw_rules_default - デフォルトのファイアウォールポリシー。ほとんどの場合、変更されません。
- ufw_rules_allow - 設定される受信ルールのセット。
- sshd_config_lines - SSHD設定で必要な変更。
- option_file2ban - true の場合、file2ban パッケージが追加で導入されます。
- whitelistedips - 安全と見なされるIPのセット - あなたのオフィスのゲートウェイやビルドサーバなど; 偶然にブロックされないようにします。
ステップ1: ファイアウォールを設定する
1番目のステップはufwファイアウォールをインストールして設定します:
- include: "{{root_dir}}/tasks_ufw.yml"
デフォルトで、以下のファイアウォールルールが適用されます(送信はすべて許可され、HTTP・HTTPS・SSHは内部で許可されます):
ufw_rules_default:
- {
policy: deny,
direction: incoming
}
- {
policy: allow,
direction: outgoing
}
ufw_rules_allow:
- {
port: 80,
proto: tcp
}
- {
port: 443,
proto: tcp
}
- {
port: 22,
proto: tcp
}
これらの変数を上書きしてニーズに合わせることができます。
ステップ2: デプロイユーザーを作成する
このボックスで作業してプロビジョニングする予定であれば、ほとんどの場合、root の下で作業したくないでしょう。したがって、2番目のステップは、提供されたSSHキーのセットによって承認されたデプロイユーザーを作成し、パスワードなしでsudoerになることを許可します(自動プロビジョニングの基本要件):
- include: "{{root_dir}}/use/__create_deploy_user.yml user={{deploy_user}} group={{deploy_user}} home=/home/{{deploy_user}}"
when: deploy_user is defined
- name: SSH | キーの承認
authorized_key: user={{deploy_user}} key="{{ lookup('file', item) }}"
when: deploy_user_keys is defined
with_items: "{{deploy_user_keys}}"
sudo: yes
このように、プレイブックでユーザーを定義できます:
jenkins_user: jenkins
jenkins_authorized_keys:
- "{{playbook_dir}}/components/files/ssh/vyacheslav.pub"
その後、これをロールにパラメーターとして渡すことができます:
roles:
- {
role: "sa-box-bootstrap",
root_dir: "{{playbook_dir}}/public/ansible_developer_recipes",
deploy_user: "{{jenkins_user}}",
deploy_user_keys: "{{jenkins_authorized_keys}}"
}
ステップ3: SSHをセキュアにする(オプション)
- name: SSH | SSH鍵のセキュリティを強化
lineinfile: dest=/etc/ssh/sshd_config regexp="{{item.regexp}}" line="{{item.line}}"
with_items: "{{sshd_config_lines}}"
when: option_enforce_ssh_keys_login
become: true
tags: ssh
変数 option_enforce_ssh_keys_login が true に設定されている場合、sshd 設定が sshd_config_lines ルールに従って変更されます。デフォルトでは、v2 プロトコルを使用し、root ログインを禁止し、パスワード認証を禁止します。
ステップ4: SSHユーザーアクセスを試みる奇妙な人物をバンする
変数 option_file2ban が true の場合、特別なツール file2ban がインストールされます。 これは失敗したSSHログイン試行を監視し、侵入者をバンします。 偶然にブロックされないように、ホワイトリストに自身のIPを追加するのは良いアイデアです。 単一のIPやネットワークマスクもサポートされています。例えば:
whitelistedips:
- 127.0.0.1
- 127.0.0.1/8
自分のボックスブートストラッププロジェクトを作成する
今後使用できる基本的なブートストラッププロジェクトを準備しましょう。 以下のファイルが含まれています:
- bootstrap.sh - ansible と依存関係をインストールします。
- init.sh - 初期化します。
- .projmodules - .gitmodules git 構文と完全に互換性があり、プレイブックで使用される依存関係のリストを指定します。 特に、ansible-によってデフォルトで開発者レシピ(便利なデプロイメントレシピのリポジトリ)と呼ばれる ansible ロールが含まれています。
[submodule "public/ansible_developer_recipes"]
path = public/ansible_developer_recipes
url = [email protected]:Voronenko/ansible-developer_recipes.git
[submodule "roles/sa-box-bootstrap"]
path = roles/sa-box-bootstrap
url = [email protected]:softasap/sa-box-bootstrap.git
- hosts - ここにサーバーの初期ボックス資格情報をリストします。
[bootstrap]
box_bootstrap ansible_ssh_host=192.168.0.17 ansible_ssh_user=your_user ansible_ssh_pass=your_password
- box_vars.yml - ここで、好みのデプロイユーザー名やキーなどの特定の環境のオーバーライドを設定します。
- box_bootstrap.yml - ここにはボックスのプロビジョニング手順を置きます。ボックスセキュリティは最初のステップだけです。 sa-box-bootstrap のパラメーターをオーバーライドするには、以下の例のようにパラメーターを渡します。
- hosts: all
vars_files:
- ./box_vars.yml
roles:
- {
role: "sa-box-bootstrap",
root_dir: "{{playbook_dir}}/public/ansible_developer_recipes",
deploy_user: "{{my_deploy_user}}",
deploy_user_keys: "{{my_deploy_authorized_keys}}"
}
コードの実行
コードはリポジトリからダウンロードできます https://github.com/Voronenko/devops-bootstrap-box-template 使用するには、フォークしてパラメーターをニーズに合わせて調整し、使用してください。 調整には、box_vars.yml ファイルの作成が含まれます。上記のいずれかの変数をオーバーライドできます。 最小限必要なセットは deploy_user とあなたの公開鍵です。
box_deploy_user: jenkins
box_deploy_authorized_keys:
- "{{playbook_dir}}/components/files/ssh/vyacheslav.pub"
Ansible がインストールされていることを確認し(bootstrap.sh を使用)、ロールディレクトリをクローンしたことを確認してください(init.sh)。 次に setup.sh を実行します。すべてが正しく設定されていれば、以下のようなものが表示されます:
PLAY [all] ********************************************************************
GATHERING FACTS ***************************************************************
ok: [box_bootstrap]
TASK: [sa-box-bootstrap | 正しいホスト名を設定] ****************************
changed: [box_bootstrap]
TASK: [sa-box-bootstrap | デバッグ var="ufw_rules_allow"] ************************
ok: [box_bootstrap] => {
"var": {
"ufw_rules_allow": [
{
"port": 80,
"proto": "tcp"
},
{
"port": 443,
"proto": "tcp"
},
{
"port": 22,
"proto": "tcp"
}
]
}
}
TASK: [sa-box-bootstrap | UFW | リセットする] *************************************
ok: [box_bootstrap]
TASK: [sa-box-bootstrap | UFW | 受信/送信のデフォルトを設定する] *********
ok: [box_bootstrap] => (item={'policy': 'deny', 'direction': 'incoming'})
ok: [box_bootstrap] => (item={'policy': 'allow', 'direction': 'outgoing'})
TASK: [sa-box-bootstrap | UFW | 受信トラフィックを許可するルールを設定する] ****
ok: [box_bootstrap] => (item={'port': 80, 'proto': 'tcp'})
ok: [box_bootstrap] => (item={'port': 443, 'proto': 'tcp'})
ok: [box_bootstrap] => (item={'port': 22, 'proto': 'tcp'})
TASK: [sa-box-bootstrap | UFW | 特定のホストからの受信トラフィックを許可するルールを設定する] ***
skipping: [box_bootstrap] => (item=ufw_rules_allow_from_hosts)
TASK: [sa-box-bootstrap | UFW | 有効化する] ************************************
changed: [box_bootstrap]
TASK: [sa-box-bootstrap | Monit | インストールされているかチェック] **********************
changed: [box_bootstrap]
TASK: [sa-box-bootstrap | Monit | libssl-dev 依存関係] **********************
changed: [box_bootstrap]
TASK: [sa-box-bootstrap | Monit | ダウンロード] ***********************************
changed: [box_bootstrap]
TASK: [sa-box-bootstrap | Monit | インストール] ************************************
changed: [box_bootstrap]
TASK: [sa-box-bootstrap | デバッグ msg="デプロイユーザー {{my_deploy_user}}:{{my_deploy_user}} を /home/{{my_deploy_user}} に作成しています"] ***
ok: [box_bootstrap] => {
"msg": "デプロイユーザー jenkins:jenkins をホームディレクトリ /home/jenkins に作成しています"
}
TASK: [sa-box-bootstrap | デプロイユーザー | グループを作成] ***********************
changed: [box_bootstrap]
TASK: [sa-box-bootstrap | デプロイユーザー | ユーザーを作成] ************************
changed: [box_bootstrap]
TASK: [sa-box-bootstrap | デプロイユーザー | キーの存在を確認] *******************
ok: [box_bootstrap]
TASK: [sa-box-bootstrap | デプロイユーザー | authorized_keys のコピーを {{ansible_user_id}} から取得] ***
skipping: [box_bootstrap]
TASK: [sa-box-bootstrap | デプロイユーザー | authorized_keys の権限を設定] ****
skipping: [box_bootstrap]
TASK: [sa-box-bootstrap | デプロイユーザー | sudoers でパスワードプロンプトを表示させないようにする] ****
changed: [box_bootstrap]
TASK: [sa-box-bootstrap | SSH | キーの承認] *******************************
changed: [box_bootstrap] => (item=/home/slavko/labs/devops-bootstrap-box-template/components/files/ssh/vyacheslav.pub)
TASK: [sa-box-bootstrap | SSH | SSH鍵のセキュリティを強化] ********************
ok: [box_bootstrap] => (item={'regexp': '^Protocol.*', 'line': 'Protocol 2'})
changed: [box_bootstrap] => (item={'regexp': '^PermitRootLogin.*', 'line': 'PermitRootLogin no'})
ok: [box_bootstrap] => (item={'regexp': '^RSAAuthentication.*', 'line': 'RSAAuthentication yes'})
ok: [box_bootstrap] => (item={'regexp': '^PubkeyAuthentication.*', 'line': 'PubkeyAuthentication yes'})
ok: [box_bootstrap] => (item={'regexp': '^ChallengeResponseAuthentication.*', 'line': 'ChallengeResponseAuthentication no'})
changed: [box_bootstrap] => (item={'regexp': '^PasswordAuthentication.*', 'line': 'PasswordAuthentication no'})
changed: [box_bootstrap] => (item={'regexp': '^MaxAuthTries.*', 'line': 'MaxAuthTries 3'})
TASK: [sa-box-bootstrap | SSH | SSHDを再起動] *********************************
changed: [box_bootstrap]
TASK: [sa-box-bootstrap | ベースUbuntuパッケージをインストール] ***********************
changed: [box_bootstrap] => (item=unzip,mc)
PLAY RECAP ********************************************************************
box_bootstrap : ok=21 changed=13 unreachable=0 failed=0
ついに、あなたが指定したデプロイユーザーを持つ安全なボックスが構築され、指定したキーでのみ認証を許可されます。root はログインできません。また、一部の受信ポートのみがルールに従って許可されています。
NMap でチェックしてログインを試みてください:
ssh 192.168.0.17
Permission denied (publickey).
ssh -ldeploy_user 192.168.0.17
ようこそ、Ubuntu 14.04.2 LTS です (GNU/Linux 3.13.0-32-generic x86_64)
deploy_user@LABBOX17:~$
注目すべき点
このプレイブックを再利用して、独自のボックスブートストラッププロジェクトを作成し、ロールを再利用して環境を迅速かつ安全に設定することができます。
Role to perform basic securing of fresh instance for further automated deploy
ansible-galaxy install softasap.sa_box_bootstap