使用Ubuntu18.04自动化初始服务器设置

来自菜鸟教程
跳转至:导航、​搜索

介绍

当你第一次创建一个新的 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 连接的情况下启用。

如何使用脚本

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

使用用户数据

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

如果您从 控制面板 创建 Droplet,则可以在 选择附加选项 部分中选中 用户数据 复选框。 将出现一个文本框,您可以在其中粘贴脚本:

如果您正在 使用 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_server_setup.sh -o /tmp/initial_setup.sh

检查脚本以确保它正确下载并更新您希望更改的任何变量:

nano /tmp/initial_setup.sh

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

bash /tmp/initial_setup.sh

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

脚本内容

您可以在 DigitalOcean 社区 GitHub 组织的 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

结论

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