まくろぐ
更新:
作成:

何をするか?

ConoHa VPS などの VPS を借りてサーバーをセットアップしようとすると、多くの手順が必要になります。 そんなとき、最初から Ansible で環境構築するようにしておけば、セットアップ手順を Ansible Playbook でドキュメント化することができ、サーバーの再構築が容易になります。

ここでは、初期状態の VPS サーバー(root 接続のみ可能な状態)に、ansible というユーザーを追加し、Ansible で VPS を制御するための環境を整えます。

前提条件

  • コントロールノード側(手元の PC)には、あらかじめ Ansible の実行環境がインストールされているものとします(参考: Ansible をインストールする)。
  • マネージドノード側(VPS サーバー)にはパスワードで SSH 接続することが可能で、Python3 の実行環境がインストールされているものとします。最新の Ubuntu であれば、これらのソフトウェアは最初から使えるはずです。

多くの場合、VPS を使い始めた直後は、root ユーザーで直接 SSH 接続できるようになっていると思います。 今回の手順で、Ansible による接続ができるようになった後は、SSH デーモンの設定を変更して、root ユーザーでの直接接続を禁止するようにしておくと安全です。 もちろん、この設定には Ansible を使うことができます。

セットアップの流れ

ここでは、VPS に ansible というユーザーを作成し、Ansible で制御できるようにセットアップします。

  1. VPS に ansible ユーザーを作成する
  2. ansible ユーザーを sudoers に登録する
  3. VPS に ansible ユーザーで SSH 接続できるようにする
  4. (おまけ)Ansible で SSH デーモンの設定を変更しておく

root ユーザーで直接 SSH 接続すれば専用のユーザーを作成する必要はないのですが、それは sshd の運用上望ましくない ので却下とします。

VPS に ansible ユーザーを作成する

VPS に root ユーザーで SSH 接続し、useradd コマンドを使って ansible ユーザーを作成します。 あるいは、多くの VPS サービスでは、Web サイトからコンソール接続できるようになっているので、そこで root ログインして作業しても構いません。

VPS に root 接続してユーザーを追加
$ ssh root@example.com
root@examle.com's password: ********

(VPS)# useradd -m ansible
(VPS)# passwd ansible

ユーザー作成時には、-m (--create-home) オプションを指定してホームディレクトリを作成しておきます。 これは、SSH の公開鍵を ~/.ssh 以下に配置する必要があるからです。 後述の SSH 接続 (ssh-id-copy) のため、passwd コマンドで、ユーザーのパスワードも設定しておきます。

☝️ ansible というユーザー名 すでに sudoers 登録されたユーザーが存在する場合は、Ansible でもそのユーザーを使えばいいのではと思うかもしれません。 ここでは Ansible での操作には ansible というユーザーを使うというルールに統一しています。 こうすることでインベントリファイル内に、ansible というユーザーを決め打ちで記述できます。

ansible ユーザーを sudoers に登録する

Ansible のタスクを管理者権限で実行 (become: yes) できるようにするために、ユーザーを suduoers に登録しておきます。 次のように visudo コマンドを実行して、/etc/sudoers.d/ansible ファイルを作成します(ファイル名は何でもよいですが、ここでは ansible としています)。

(VPS)# visudo /etc/sudoers.d/ansible

ファイルの内容は次のような感じにして、ansible ユーザーであれば任意のコマンドをパスワードなしで実行できるようにしておきます。

/etc/sudoers.d/ansible
ansible ALL=(ALL) NOPASSWD:ALL

別の方法として、次のように既存の管理者系グループに ansible ユーザーを登録してしまう方法もありますが、

(VPS)# gpasswd -a ansible admin (Debian/Ubuntu の場合)
(VPS)# gpasswd -a ansible wheel (CentOS/RockyLinux の場合)

この方法を使った場合は、ansible (ansible-playbook) コマンドを実行するときに、-K (--ask-become-password) オプションで sudo パスワードの入力が必要になります。

VPS に ansible ユーザーで SSH 接続できるようにする

exit でコントロールノード(手元の PC)に戻って、SSH 鍵を作成し、VPS に公開鍵を登録します。 ここでは、~/.ssh/ansible ディレクトリ以下に SSH キーペア (id_rsaid_rsa.pub) を作成することにします。

SSH キーの作成
$ mkdir -p -m 0700 ~/.ssh/ansible
$ ssh-keygen -t rsa -f ~/.ssh/ansible/id_rsa
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): (パスワード省略するならそのまま Enter)

SSH キーができたら、ssh-id-copy コマンドで VPS に公開鍵を登録します。

SSH 公開鍵を ansible ユーザー用に登録
$ ssh-copy-id -i ~/.ssh/ansible/id_rsa.pub ansible@examle.com
...
ansible@example.com's password: (先ほど passwd で設定したパスワードを入力)

これで、SSH キーで接続できるようになったので、次のように確認しておきます。

SSH 接続の確認
$ ssh -i ~/.ssh/ansible/id_rsa ansible@example.com

Ansible で接続確認する

VPS に SSH 接続できるようになったので、Ansible コマンドも実行できるようになっています。 インベントリファイルを作成して、接続先の VPS サーバー名と、ユーザー名、SSH 秘密鍵のパスを記述しておきます。

hosts.ini
example.com ansible_user=ansible ansible_ssh_private_key_file=~/.ssh/ansible/id_rsa

後は、おもむろに ansible コマンドか ansible-playbook コマンドで VPS を制御できるか確認します。

$ ansible all -i hosts.ini -m ping
example.com | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}

これで、VPS を Ansible で制御できるようになりました!

(おまけ)Ansible で SSH デーモンの設定を変更しておく

VPS の SSH デーモンは、デフォルトで root ユーザーでの SSH 接続が許可 (PermitRootLogin: yes) されていたりするので、この設定を変更しておくと安全です。 そのための Ansible Playbook の記述例が下記ページにあるので参考にしてください。

この Playbook を次のように実行すれば、VPS への root ユーザーでの接続が無効になります。

$ ansible-playbook -i hosts.ini secure-sshd.yaml

このような調子で、サーバーのセットアップを自動化していけます。

関連記事

更新:
作成:

SSH サーバーを安全に運用するには、いくつかのベストプラクティスがあります。 ここでは、root ユーザーでの SSH 接続を拒否 (PermitRootLogin no) する設定例を紹介します。

secure-sshd.yaml (Playbook)
---
- hosts: all
  gather_facts: false
  become: true

  tasks:
    - name: prohibit root login
      ansible.builtin.lineinfile:
        path: /etc/ssh/sshd_config
        state: present
        regexp: '^PermitRootLogin '
        line: 'PermitRootLogin no'
      notify:
        - reload ssh daemon

  handlers:
    - name: reload ssh daemon
      ansible.builtin.service:
        name: sshd
        state: reloaded

この Ansible Playbook では、次のようなことを行っています。

  1. lineinfile モジュール/etc/ssh/sshd_config の内容を修正する
    • PermitRootLogin で始まる行が見つからない場合は、ファイルの末尾に PermitRootLogin no を追加する
    • PermitRootLogin で始まる行が見つかった場合は、PermitRootLogin no に置換する(ただし、最初からその設定が記述されていたら何もしない)
  2. service モジュール で SSH デーモンに設定をリロードさせる

この設定を行うと、root ユーザーでの SSH 接続ができなくなるので注意してください。 必ず、root ユーザー以外で SSH 接続できることを確認してから実行してください。

関連記事

更新:
作成:

ユーザーが Linux にログインしたときに起動するデフォルトシェルは、chsh (change login shell) コマンドで変更することができます。

カレントユーザーのログインシェルを /bin/bash に変更する
$ chsh -s /bin/bash

-s オプションではシェルのフルパスを指定する必要があることに注意してください。 例えば、Bash を使いたければ、bash ではなく /bin/bash と入力します。 -s オプションを省略すると、インタラクティブにシェルのパスを入力できます。

参考リンク

現在のシステムで選択可能なシェルの一覧は、/etc/shells ファイルで確認できます。

/etc/shells(Ubuntu 22.04 の場合)
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/usr/bin/sh
/bin/dash
/usr/bin/dash
/usr/bin/tmux
/usr/bin/screen

ユーザーごとのログインシェルが現在どう設定されているかは、/etc/passwd ファイルで確認できます。

$ cat /etc/passwd
...(省略)...
maku:x:1000:1000::/home/maku:/bin/bash

関連記事

メニュー

まくろぐ
サイトマップまくへのメッセージ