Ubuntu 18.04を使用したサーバーの初期セットアップの自動化

前書き

新しいUbuntu 18.04サーバーを初めて作成するとき、基本的なセットアップの一部として早期に実行する必要があるいくつかの構成手順があります。 これにより、サーバーのセキュリティと使いやすさが向上し、その後のアクションの強固な基盤が得られます。

https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-18-04 [これらの手順を手動で完了できます]が、プロセスをスクリプト化して時間を節約し、人的エラーを排除します。 このガイドでは、https://github.com/do-community/automated-setups/blob/master/Ubuntu-18.04/initial_server_setup.sh [初期サーバーセットアップガイドの手順を自動化するスクリプト]の使用方法について説明します。

スクリプトは何をしますか?

このスクリプトは、https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-18-04 [Ubuntu 18.04初期サーバーセットアップガイド]で説明されている手順を手動で実行する代わりに使用できます。 Ubuntu 18.04でのSSHキーのセットアップのガイド。

次の変数は、スクリプトの実行方法に影響します。

  • + USERNAME +:作成して `+ sudo +`権限を付与する通常のユーザーアカウントの名前。

  • + COPY_AUTHORIZED_KEYS_FROM_ROOT +:SSHキー資産を* root *アカウントから新しい `+ sudo +`アカウントにコピーするかどうか。

  • + OTHER_PUBLIC_KEYS_TO_ADD +: `+ sudo +`対応アカウントに追加する他の公開キーを表す文字列の配列。 これは、オプションで、* root *アカウントからキーをコピーすることに加えて、またはその代わりに使用できます。

スクリプトを実行する前に、必要に応じてこれらの変数を更新する必要があります。

スクリプトを実行すると、次のアクションが実行されます。

  • `+ USERNAME `変数で指定された名前を使用して、 ` sudo +`特権を持つ通常のユーザーアカウントを作成します。

  • 新しいアカウントの初期パスワード状態を構成します。

  • サーバーがパスワード認証用に設定されている場合、元の生成された管理パスワードは* root *アカウントから新しい `+ sudo +`アカウントに移動されます。 * root *アカウントのパスワードはロックされます。

  • サーバーがSSHキー認証用に設定されている場合、空のパスワードが `+ sudo +`アカウントに設定されます。

  • `+ sudo +`ユーザーのパスワードは期限切れとしてマークされているため、最初のログイン時に変更する必要があります。

  • `+ COPY_AUTHORIZED_KEYS_FROM_ROOT `が ` true `に設定されている場合、* root *アカウントの ` authorized_keys `ファイルは ` sudo +`ユーザーにコピーされます。

  • `+ OTHER_PUBLIC_KEYS_TO_ADD `で定義されたキーは、 ` sudo `ユーザーの ` authorized_keys +`ファイルに追加されます。

  • * root *ユーザーのパスワードベースのSSH認証は無効になっています。

  • UFWファイアウォールは、許可されたSSH接続で有効になります。

スクリプトの使用方法

スクリプトは2つの方法で実行できます。https://www.digitalocean.com/community/tutorials/an-introduction-to-droplet-metadata#about-user-data [作成中のサーバーのユーザーデータフィールドに追加する]または* root *としてログインし、プロビジョニング後に実行します。

ユーザーデータの使用

DigitalOceanでドロップレットを作成するとき、オプションでhttps://www.digitalocean.com/community/tutorials/an-introduction-to-droplet-metadata#how-to-provide-user-data[user data]を指定できます。追加の構成を実行するための初期サーバープロビジョニング中に実行されるスクリプト。

*コントロールパネル*からドロップレットを作成する場合、*追加オプションの選択*セクションで*ユーザーデータ*チェックボックスを選択できます。 スクリプトを貼り付けることができるテキストボックスが表示されます。

image:https://assets.digitalocean.com/articles/automated_initial_server_setup_1804/user_data_field.png [DigitalOceanコントロールパネルのユーザーデータフィールド]

*DigitalOcean API *を使用してドロップレットを作成の場合、 `+ user_data +`属性を使用してスクリプトを渡すことができます。代わりに。

https://github.com/digitalocean/doctl [* `+ doctl `コマンドラインツール*を使用してドロップレットを作成]の場合、 `-user-data-file +`オプションを使用してスクリプトを渡すことができます:

doctl compute droplet create ... --user-data-file

ユーザーデータの追加に使用する方法に関係なく、スクリプトは新しいサーバーの初回起動時に実行されます。 プロセスが完了するまで数分待たなければならない場合がありますが、その後、 `+ sudo +`対応のユーザーを使用してサーバーにログインし、さらに設定を行うことができます。

初めてログインするとき、パスワードを変更するように求められます。 新しい資格情報を提供して確認すると、サーバーは現在のSSHセッションを終了します。 その後、通常どおりにSSHで再度接続できます。

プロビジョニング後のスクリプトの実行

ユーザーデータを使用したくない場合は、サーバーの起動後にSSHを介してスクリプトを手動で実行することもできます。

ローカルコンピューターにスクリプトをダウンロードした場合、次のように入力してスクリプトをSSHに直接渡すことができます。

ssh [email protected] "bash -s" -- <

これで、さらに設定を行うために、 `+ sudo +`アカウントを使用してログインできるようになります。

ローカルコンピューターにスクリプトをダウンロードしていない場合は、サーバーの* root *アカウントにログインすることから始めます。

次に、生のスクリプトをサーバーにダウンロードします。

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 +`が有効なユーザーを使用してログインし、さらに設定を完了することができるはずです。

スクリプトの内容

初期サーバー設定スクリプトは、DigitalOcean Community GitHub組織のhttps://github.com/do-community/automated-setups/blob/master/Ubuntu-18.04/initial_server_setup.sh[automated-setups repository]にあります。 スクリプトの内容を直接コピーまたはダウンロードするには、スクリプトの上部にある* Raw *ボタン、またはhttps://raw.githubusercontent.com/do-community/automated-setups/master/Ubuntu-18.04/initial_server_setup.shをクリックします[生のコンテンツを直接表示するには、ここをクリックしてください]。

便宜上、完全な内容もここに含まれています。

#!/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

結論

サーバーの初期セットアップを自動化すると、少し時間を節約でき、さらに設定するための優れた基盤が得られます。 追加の手順が必要な場合は、スクリプトの実行後にログインして手動で続行するか、スクリプトの最後に手順を追加してプロセスを自動化できます。

前の投稿:Ubuntu 16.04でNginxにgzipモジュールを追加する方法
次の投稿:Ubuntu 16.04にAnaconda Pythonディストリビューションをインストールする方法