Ubuntu18.04を使用したサーバーの初期セットアップの自動化
序章
新しいUbuntu18.04サーバーを最初に作成するときは、基本的なセットアップの一部として早い段階で実行する必要のあるいくつかの構成手順があります。 これにより、サーバーのセキュリティと使いやすさが向上し、後続のアクションの強固な基盤が提供されます。
これらの手順は手動で実行できますが、時間を節約し、人的エラーを排除するために、プロセスのスクリプトを作成する方が簡単な場合があります。 このガイドでは、スクリプトを使用して、初期サーバーセットアップガイドの手順を自動化する方法について説明します。
スクリプトは何をしますか?
このスクリプトは、Ubuntu18.04初期サーバーセットアップガイドおよびUbuntu18.04でのSSHキーのセットアップに関するガイドで概説されている手順を手動で実行する代わりの方法です。
次の変数は、スクリプトの実行方法に影響を与えます。
USERNAME
:作成して付与する通常のユーザーアカウントの名前sudo
特権。COPY_AUTHORIZED_KEYS_FROM_ROOT
:SSHキーアセットをrootアカウントから新しいアカウントにコピーするかどうかsudo
アカウント。OTHER_PUBLIC_KEYS_TO_ADD
:追加する他の公開鍵を表す文字列の配列sudo
-有効なアカウント。 これは、オプションで、 root アカウントからキーをコピーすることに加えて、またはその代わりに使用できます。
スクリプトを実行する前に、必要に応じてこれらの変数を更新する必要があります。
スクリプトが実行されると、次のアクションが実行されます。
- で通常のユーザーアカウントを作成する
sudo
によって指定された名前を使用する特権USERNAME
変数。 - 新しいアカウントの初期パスワード状態を構成します。
- サーバーがパスワード認証用に構成されている場合、元の生成された管理パスワードはrootアカウントから新しいアカウントに移動されます
sudo
アカウント。 次に、rootアカウントのパスワードがロックされます。 - サーバーがSSHキー認証用に構成されている場合、空白のパスワードが
sudo
アカウント。
- サーバーがパスワード認証用に構成されている場合、元の生成された管理パスワードはrootアカウントから新しいアカウントに移動されます
- The
sudo
ユーザーのパスワードは期限切れとしてマークされているため、最初のログイン時に変更する必要があります。 - The
authorized_keys
rootアカウントのファイルがにコピーされますsudo
ユーザーの場合COPY_AUTHORIZED_KEYS_FROM_ROOT
に設定されていますtrue
. - で定義されたすべてのキー
OTHER_PUBLIC_KEYS_TO_ADD
に追加されますsudo
ユーザーのauthorized_keys
ファイル。 - rootユーザーのパスワードベースのSSH認証は無効になっています。
- UFWファイアウォールは、SSH接続が許可された状態で有効になっています。
スクリプトの使用方法
スクリプトは、作成時にサーバーのユーザーデータフィールドに追加するか、 root としてログインし、プロビジョニング後に実行するという2つの方法で実行できます。
ユーザーデータの使用
DigitalOceanでドロップレットを作成する場合、オプションで user data を指定できます。これは、追加の構成を実行するための初期サーバープロビジョニング中に実行されるスクリプトです。
コントロールパネルからドロップレットを作成する場合は、追加オプションの選択セクションのユーザーデータチェックボックスを選択できます。 スクリプトを貼り付けることができるテキストボックスが表示されます。
DigitalOcean API を使用してドロップレットを作成している場合は、 user_data
代わりに属性。
doctlコマンドラインツールを使用してドロップレットを作成している場合は、 --user-data-file
オプション:
- doctl compute droplet create ... --user-data-file /path/to/script
ユーザーデータの追加に使用する方法に関係なく、新しいサーバーが最初に起動したときにスクリプトが実行されます。 プロセスが完了するまで数分待たなければならない場合がありますが、その後、サーバーにログインできます。 sudo
-さらなる構成のための有効なユーザー。
初めてログインするときに、パスワードを変更するように求められます。 新しい資格情報を入力して確認すると、サーバーは現在のSSHセッションを終了します。 その後、通常どおりSSHで再度接続できます。
プロビジョニング後のスクリプトの実行
ユーザーデータを使用したくない場合は、サーバーの起動後にSSH経由でスクリプトを手動で実行することもできます。
スクリプトをローカルコンピューターにダウンロードした場合は、次のように入力して、スクリプトをSSHに直接渡すことができます。
- ssh root@servers_public_IP "bash -s" -- < /path/to/script/file
これで、を使用してログインできるようになります。 sudo
それ以上の構成を考慮してください。
スクリプトをローカルコンピューターにダウンロードしていない場合は、サーバーのrootアカウントにログインすることから始めます。
- ssh root@servers_public_IP
次に、生のスクリプトをサーバーにダウンロードします。
- curl -L https://raw.githubusercontent.com/do-community/automated-setups/master/Ubuntu-18.04/initial_server_setup.sh -o /tmp/initial_setup.sh
スクリプトを調べて、スクリプトが正しくダウンロードされたことを確認し、変更する変数を更新します。
- nano /tmp/initial_setup.sh
満足したら、を使用してスクリプトを手動で実行します bash
:
- bash /tmp/initial_setup.sh
を使用してログインできるはずです sudo
-ユーザーがそれ以上の構成を完了できるようにしました。
スクリプトの内容
初期サーバーセットアップスクリプトは、DigitalOceanCommunityGitHub組織のautomated-setupsリポジトリにあります。 スクリプトの内容を直接コピーまたはダウンロードするには、スクリプトの上部にある Raw ボタンをクリックするか、ここをクリックして生の内容を直接表示します。
便宜上、完全なコンテンツもここに含まれています。
#!/bin/bash
set -euo pipefail
########################
### SCRIPT VARIABLES ###
########################
# Name of the user to create and grant sudo privileges
USERNAME=sammy
# Whether to copy over the root user's `authorized_keys` file to the new sudo
# user.
COPY_AUTHORIZED_KEYS_FROM_ROOT=true
# Additional public keys to add to the new sudo user
# OTHER_PUBLIC_KEYS_TO_ADD=(
# "ssh-rsa AAAAB..."
# "ssh-rsa AAAAB..."
# )
OTHER_PUBLIC_KEYS_TO_ADD=(
)
####################
### SCRIPT LOGIC ###
####################
# Add sudo user and grant privileges
useradd --create-home --shell "/bin/bash" --groups sudo "${USERNAME}"
# Check whether the root account has a real password set
encrypted_root_pw="$(grep root /etc/shadow | cut --delimiter=: --fields=2)"
if [ "${encrypted_root_pw}" != "*" ]; then
# Transfer auto-generated root password to user if present
# and lock the root account to password-based access
echo "${USERNAME}:${encrypted_root_pw}" | chpasswd --encrypted
passwd --lock root
else
# Delete invalid password for user if using keys so that a new password
# can be set without providing a previous value
passwd --delete "${USERNAME}"
fi
# Expire the sudo user's password immediately to force a change
chage --lastday 0 "${USERNAME}"
# Create SSH directory for sudo user
home_directory="$(eval echo ~${USERNAME})"
mkdir --parents "${home_directory}/.ssh"
# Copy `authorized_keys` file from root if requested
if [ "${COPY_AUTHORIZED_KEYS_FROM_ROOT}" = true ]; then
cp /root/.ssh/authorized_keys "${home_directory}/.ssh"
fi
# Add additional provided public keys
for pub_key in "${OTHER_PUBLIC_KEYS_TO_ADD[@]}"; do
echo "${pub_key}" >> "${home_directory}/.ssh/authorized_keys"
done
# Adjust SSH configuration ownership and permissions
chmod 0700 "${home_directory}/.ssh"
chmod 0600 "${home_directory}/.ssh/authorized_keys"
chown --recursive "${USERNAME}":"${USERNAME}" "${home_directory}/.ssh"
# Disable root SSH login with password
sed --in-place 's/^PermitRootLogin.*/PermitRootLogin prohibit-password/g' /etc/ssh/sshd_config
if sshd -t -q; then
systemctl restart sshd
fi
# Add exception for SSH and then enable UFW firewall
ufw allow OpenSSH
ufw --force enable
結論
サーバーの初期設定を自動化すると、時間を少し節約でき、さらに構成するための優れた基盤が得られます。 実行したい追加の手順がある場合は、スクリプトの実行後にログインして手動で続行するか、スクリプトの最後に手順を追加してプロセスを自動化することができます。