介绍
当您第一次创建新的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 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
结论
自动化初始服务器设置可以为您节省一点时间,并为您进一步配置奠定良好的基础。 如果您想要采取其他步骤,您可以在脚本运行后登录以手动继续,也可以将步骤追加到脚本末尾以自动执行该过程。