Tự động cài đặt Server ban đầu với Ubuntu 18.04

2 năm trước

Giới thiệu

Khi lần đầu tạo server Ubuntu 18.04 mới, có một vài bước cấu hình nên thực hiện sớm như là một phần của thiết lập cơ bản. Điều này sẽ làm tăng tính bảo mật và khả năng sử dụng của server của bạn và cung cấp nền tảng vững chắc cho các hành động tiếp theo.

Mặc dù bạn có thể hoàn thành các bước này theo cách thủ công, đôi khi có thể dễ dàng hơn trong việc viết các quy trình để tiết kiệm thời gian và loại bỏ lỗi. Hướng dẫn này giải thích cách sử dụng tập lệnh để tự động hóa các bước trong hướng dẫn thiết lập máy chủ ban đầu.

Script làm gì?

Các biến sau ảnh hưởng đến cách chạy tập lệnh:

  • USERNAME: Tên của tài khoản người dùng thông thường để tạo và cấp quyền sudo cho.
  • COPY_AUTHORIZED_KEYS_FROM_ROOT: Sao chép nội dung khóa SSH từ tài khoản root sang tài khoản sudo mới.
  • OTHER_PUBLIC_KEYS_TO_ADD: Một chuỗi các đại diện cho các khóa công khai khác để thêm vào tài khoản được kích hoạt bằng sudo. Tùy chọn này có thể được sử dụng ngoài hoặc thay vì sao chép các khóa từ tài khoản root.

Bạn nên cập nhật các biến này trước khi chạy tập lệnh.

Khi tập lệnh chạy, các hành động sau được thực hiện:

  • Tạo tài khoản user thông thường với quyền sudo bằng tên được chỉ định bởi biến USERNAME.
  • Định cấu hình trạng thái mật khẩu ban đầu cho tài khoản mới:
    • Nếu server được cấu hình để xác thực mật khẩu, mật khẩu quản trị ban đầu được tạo sẽ được chuyển từ tài khoản root sang tài khoản sudo mới. Mật khẩu cho tài khoản root sau đó bị khóa.
    • Nếu server được cấu hình để xác thực khóa SSH, mật khẩu trống sẽ được đặt cho tài khoản sudo.
  • Mật khẩu của sudo user được đánh dấu là hết hạn phải được thay đổi khi đăng nhập lần đầu.
  • Tệp authorized_keys từ tài khoản root được sao chép sang sudo user nếu COPY_AUTHORIZED_KEYS_FROM_ROOT được đặt thành true
  • Bất kỳ khóa nào được xác định trong OTHER_PUBLIC_KEYS_TO_ADD đều được thêm vào tệp   authorized_keys của sudo user.
  • Xác thực SSH dựa trên mật khẩu bị tắt cho root user.
  • Tường lửa UFW được kích hoạt với các kết nối SSH được cho phép.
 

Cách sử dụng tập lệnh

Tập lệnh có thể được chạy theo hai cách: thêm nó vào trường dữ liệu người dùng của server trong khi tạo hoặc đăng nhập với tư cách là root và thực thi nó sau khi cấp phép.

Sử dụng dữ liệu người dùng

Khi tạo một VPS trên DigitalOcean, bạn có thể tùy chọn chỉ định dữ liệu người dùng, một tập lệnh được chạy trong khi cấp phép máy chủ ban đầu để thực hiện cấu hình bổ sung.

Nếu đang tạo một VPS từ Control Panel, bạn có thể chọn hộp User data trong phần Select additional options. Một hộp văn bản sẽ xuất hiện nơi bạn có thể dán tập lệnh:

DigitalOcean control panel user data field

Nếu đang tạo VPS bằng cách sử dụng API DigitalOcean, bạn có thể chuyển vào tập lệnh bằng cách sử dụng thuộc tính user_data thay thế.

Nếu đang tạo một VPS với công cụ dòng lệnh doctl, bạn có thể truyền vào tập lệnh bằng cách sử dụng tùy chọn --user-data-file:

doctl compute droplet create ... --user-data-file /path/to/script

Bất kể phương thức sử dụng để thêm dữ liệu người dùng, tập lệnh sẽ được chạy lần đầu khi máy chủ mới khởi động. Bạn có thể phải chờ vài phút để quá trình hoàn tất, nhưng sau đó, bạn có thể đăng nhập vào server của mình với user đã bật sudo để biết thêm bất kỳ cấu hình nào.

Lần đầu đăng nhập bạn sẽ được nhắc thay đổi mật khẩu của mình. Máy chủ sẽ chấm dứt phiên SSH hiện tại khi cung cấp và xác nhận thông tin đăng nhập mới. Sau đó, bạn có thể SSH trở lại như bình thường.

Chạy tập lệnh sau khi cấp phép

Nếu không muốn sử dụng dữ liệu người dùng, bạn cũng có thể chạy tập lệnh theo cách thủ công qua SSH khi server được khởi động.

Nếu đã tải tập lệnh xuống máy tính cục bộ của mình, bạn có thể chuyển tập lệnh trực tiếp tới SSH bằng cách nhập:

ssh root@servers_public_IP "bash -s" -- < /path/to/script/file

Bây giờ bạn có thể đăng nhập bằng tài khoản sudo của mình để biết thêm bất kỳ cấu hình nào.

Nếu không có tập lệnh được tải xuống máy tính cục bộ của bạn, hãy bắt đầu bằng cách đăng nhập vào tài khoản root trên server của bạn:

ssh root@servers_public_IP

Tiếp theo, tải xuống tập lệnh thô vào server:

curl -L https://raw.githubusercontent.com/do-community/automated-setups/master/Ubuntu-18.04/initial_servers_setup.sh -o /tmp/initial_setup.sh 

Kiểm tra tập lệnh để đảm bảo tập lệnh được tải xuống đúng cách và cập nhật bất kỳ biến nào bạn muốn thay đổi:

nano /tmp/initial_setup.sh 

Sau khi đã hài lòng, hãy chạy tập lệnh theo cách thủ công bằng bash:

bash /tmp/initial_setup.sh 

Bạn có thể đăng nhập bằng cách sử dụng user kích hoạt sudo để hoàn thành bất kỳ cấu hình nào khác.

 

Nội dung tập lệnh

Nội dung đầy đủ cũng được bao gồm ở đây để thuận tiện:

#!/bin/bashset -euo pipefail########################### SCRIPT VARIABLES ############################ Name of the user to create and grant sudo privilegesUSERNAME=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 privilegesuseradd --create-home --shell "/bin/bash" --groups sudo"${USERNAME}"# Check whether the root account has a real password setencrypted_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 accessecho"${USERNAME}:${encrypted_root_pw}" | chpasswd --encrypted
passwd --lock rootelse# 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 changechage --lastday 0"${USERNAME}"# Create SSH directory for sudo userhome_directory="$(eval echo ~${USERNAME})"mkdir --parents "${home_directory}/.ssh"# Copy `authorized_keys` file from root if requestedif [ "${COPY_AUTHORIZED_KEYS_FROM_ROOT}" = true ]; then cp /root/.ssh/authorized_keys "${home_directory}/.ssh"fi# Add additional provided public keysfor pub_key in"${OTHER_PUBLIC_KEYS_TO_ADD[@]}"; doecho"${pub_key}" >> "${home_directory}/.ssh/authorized_keys"done# Adjust SSH configuration ownership and permissionschmod 0700"${home_directory}/.ssh"chmod 0600"${home_directory}/.ssh/authorized_keys"chown --recursive "${USERNAME}":"${USERNAME}""${home_directory}/.ssh"# Disable root SSH login with passwordsed --in-place 's/^PermitRootLogin.*/PermitRootLogin prohibit-password/g' /etc/ssh/sshd_configif sshd -t -q; then systemctl restart sshdfi# Add exception for SSH and then enable UFW firewallufw allow OpenSSH
ufw --force enable
 

Kết luận

Tự động hóa việc thiết lập server ban đầu giúp bạn tiết kiệm một chút thời gian và cung cấp nền tảng tốt để cấu hình thêm. Nếu có các bước bổ sung, bạn có thể đăng nhập sau khi tập lệnh chạy để tiếp tục theo cách thủ công hoặc thêm các bước vào cuối tập lệnh để tự động hóa quy trình.