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