使用Ubuntu 18.04自动执行初始服务器设置

当您第一次创建新的Ubuntu 18.04服务器时,您应该尽早完成一些配置步骤,作为基本设置的一部分。这将增加服务器的安全性和可用性,并为后续操作奠定坚实的基础。而...

介绍

当您第一次创建新的Ubuntu 18.04服务器时,您应该尽早完成一些配置步骤,作为基本设置的一部分。 这将增加服务器的安全性和可用性,并为后续操作奠定坚实的基础。

虽然您可以手动完成这些步骤 ,但有时可以更轻松地为流程编写脚本以节省时间并消除人为错误。 本指南介绍了如何使用脚本自动执行初始服务器设置指南中的步骤

脚本做什么?

此脚本是手动运行Ubuntu 18.04初始服务器设置指南中介绍的过程以及在Ubuntu 18.04设置SSH密钥的指南的替代方法。

以下变量影响脚本的运行方式:

  • USERNAME :要创建和授予sudo权限的常规用户帐户的名称。
  • COPY_AUTHORIZED_KEYS_FROM_ROOT :是否将SSH密钥资产从帐户复制到新的sudo帐户。
  • OTHER_PUBLIC_KEYS_TO_ADD :表示要添加到启用sudo帐户的其他公钥的字符串数组。 这可以选择使用,或者从帐户复制密钥。

在运行脚本之前,您应该根据需要更新这些变量。

脚本运行时,将执行以下操作:

  • 使用由USERNAME变量指定的名称,使用sudo权限创建常规用户帐户。
  • 为新帐户配置初始密码状态:
    • 如果服务器配置为进行密码验证,则原始的生成管理密码将从帐户移至新的sudo帐户。 然后锁定帐户的密码。
    • 如果服务器配置为使用SSH密钥身份验证,则为sudo帐户设置空密码。
  • sudo用户的密码被标记为过期,因此必须在首次登录时更改密码。
  • 如果COPY_AUTHORIZED_KEYS_FROM_ROOT设置为true ,则帐户中的authorized_keys文件将被复制到sudo用户。
  • OTHER_PUBLIC_KEYS_TO_ADD中定义的任何键OTHER_PUBLIC_KEYS_TO_ADD添加到sudo用户的authorized_keys文件中。
  • root用户禁用基于密码的SSH身份验证。
  • UFW防火墙已启用SSH连接。

如何使用脚本

脚本可以通过两种方式运行: 在创建过程中将其添加到服务器的用户数据字段,或者以root身份登录并在配置后执行。

使用用户数据

在DigitalOcean上创建Droplet时,您可以选择指定用户数据 ,即在初始服务器配置期间运行的脚本,以执行其他配置。

如果您从控制面板创建Droplet,则可以在Select additional options部分中选择User data复选框。 将出现一个文本框,您可以在其中粘贴脚本:

DigitalOcean控制面板用户数据字段

如果您使用DigitalOcean API创建Droplet ,则可以使用user_data属性代替传入脚本。

如果使用doctl命令行工具创建Droplet,则可以使用--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_servers_setup.sh -o /tmp/initial_setup.sh

检查脚本以确保它能够正确下载并更新任何想要更改的变量:

nano /tmp/initial_setup.sh

一旦满足,使用bash手动运行脚本:

bash /tmp/initial_setup.sh

您应该能够使用sudo enableable用户登录以完成任何进一步的配置。

脚本内容

您可以在DigitalOcean Community GitHub组织的自动设置存储库中找到初始服务器设置脚本。 要直接复制或下载脚本内容,请单击脚本顶部的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

结论

自动化初始服务器设置可以为您节省一点时间,并为您进一步配置奠定良好的基础。 如果您想要采取其他步骤,您可以在脚本运行后登录以手动继续,也可以将步骤追加到脚本末尾以自动执行该过程。