Context:
Bài viết này mình chia sẻ một số điểm mình thấy cần làm và lý do cần làm khi setup một ubuntu server mới theo kinh nghiệm cá nhân và dựa trên các lỗi lặp đi lặp lại trong team mình Có rất nhiều dạng bài viết như vầy được được viết và từ những cloud và các trang web nổi tiếng, bạn có thể tham khảo thêm trên để lấy thêm các scope khác phù hợp với môi trường làm việc và tiểu chuẩn setup của các bạn. Mình quen làm việc với môi trường Ubuntu Server nhưng các việc này hầu hết đều là chung cho môi trường Linux khác.
Nội dung chính:
- Tạo user & cấu hình cho user mới.
- Cấu hình ssh:
- Cấu hình Swap file
- Cấu hình firewall
- Cấu hình DNS
- Đảm bảo hệ thống được update
I. Tạo user & cấu hình cho user mới.
Why:
Thông thường một server mới khi được init sẽ được setup với 1 user mặc định, có thể là root ( vd Digital Ocean), hoặc user mặc định theo linux distro ( vd Aws ubuntu cho Ubuntu hoặc ec2-user cho Amazon Linux), chỉ có 1 số ít cloud cho phép điền user mong muốn khi khởi tạo/ provisioning server. Vậy nếu sử dụng user mặc định thì có rủi ro gì?
- Nếu là Root: việc này cực kì không nên, vì root user là user tối thượng có quyền cao nhất của system. nên việc hạn chế tối đa các tác vụ thông thường với root user là bắt buộc, sử dụng root vừa khó cho việc quản lý mà vừa tạo ra nhiều rủi ro về security.
- Nếu là non-root user: Tránh các lỗi zero-day hoặc bị khai khác bởi các bot script tấn công theo phương pháp vét cạn & tìm các config mặc định để khai thác.
What:
- Tạo user & group mới: để giải quyết why bên trên.
- Group mới (tùy chọn): tương tự với user, nếu thông thường cloud được tạo ra với account root thì cũng chỉ có group root được tạo mặc định, và khi user được tạo thì một group mới được tạo ra cùng tên với user, nhưng theo mình thì cứ tạo thêm 1 group mặc định khác ( vd tên product của bạn)
- Cho user mới quyền truy cập sudo ( tùy chọn và cân nhắc): việc này sẽ giúp cho user có quyền thực hiện tác tác vụ liên quan đến quyền root ( mình thích thuật ngữ mượn tay root), nhưng cần cân nhắc về việc nên hay không tùy thuộc vào nhu cầu của bạn, vì nhiều quyền hơn thì nhiều rủi ro và trách nhiệm hơn, đúng người đúng việc mới là hợp lý.
- Cho phép sử dụng sudo mà không cần nhập password ( tùy chọn & cân nhắc): việc này giúp tăng tính tiện dụng, nhưng giảm khả năng bảo mật, nếu các bạn cần thì
How:
Create new user & group
# Create new user & group
sudo adduser newuser
sudo addgroup newgroup
sudo usermod -g newgroup newuser
Add user to sudo group
sudo usermod -aG sudo newuser
Use sudo without password
sudo cp /etc/sudoers /root/sudoers.bak
sudo visudo
### Add this line to end of the file
newuser ALL=(ALL) NOPASSWD: ALL
II. Cấu hình ssh:
Why:
Ssh là cổng vào của hầu hết các server Linux, nên việc đảm bảo các thông số được cấu hình đúng và đủ là cực kì cần thiết để cân bằng giữa tính tiện dụng và tính bảo mật của server.
What:
Cấu hình truy cập ssh sử dụng ssh-key: theo mình thấy thì sử dụng ssh key đảm bảo tính bảo mật tốt hơn (trừ khi nào bạn để leak private key), và cũng tiện dụng hơn nhiều. Nếu bạn có 1 server thì mỗi lần ssh gõ password không thành vấn đề, nhưng 100 servers thì cực kì mệt mỏi, và cũng rất khó để thực hiện các tác vụ automation.
Tham khảo thêm:
- https://www.sharetru.com/blog/why-use-ssh-key-authentication-for-sftp-instead-of-password-authentication
- https://www.hostwinds.com/tutorials/ssh-password-vs-key-based-authentication Cấu hình một số tham số của ssh service để tăng tính bảo mật:
- Đổi port ssh
- Disable root login
- Disable ssh login with password
- Whitelist IP có thể truy cập server thông qua SSH
How:
** 1. Cấu hình truy cập ssh sử dụng ssh-key.** Từ may local hoặc bastion host của bạn **Gen ssh key mới **
ssh-keygen
Copy ssh key lên server
ssh-copy-id -i <path/to/private/key> username@serverip
2. Cài đặt các thông số ssh
Edit file /etc/ssh/sshd_config
tương ứng với các nội dung dưới đây
sudo vi /etc/ssh/ssd_config
# Change value as the content bellow
#Port 22
Port 2349
#PermitRootLogin yes
PermitRootLogin no
# PasswordAuthentication yes
PasswordAuthentication no ListenAddress 0.0.0.0
Lưu ý với listen address 0.0.0.0
cho phép truy cập từ mọi địa chỉ ip, nếu muốn chỉ định một và IP riêng biệt thì có thể thêm nhiều dòng
ListenAddress <IP1>
ListenAddress <IP2>
ListenAddress <IP...>
** Restart ssh service để apply các config**
sudo service ssh restart
3. (Optional) Cấu hình thông tin ssh ở máy local để dễ truy cập
Host server_group.server1 hostname server_1 port 2349 user newuser identityfile </path/to/private key>
III. Cấu hình Swap file
Why:
Việc swap partition/ swap file mình thấy ít được nhắc đến trong các tutorial setup server ubuntu/linux mới, có thể là mặc định các server physical đã setup sẵn trong lúc phân vùng và cài đặt OS rồi nên thường được bỏ qua. Nhưng với các VPS, theo kinh nghiệm VPS setup từ các cloud mà có dung lượng ram dưới 4G & chưa có swap partition thì setup thêm 1 phân vùng swapfile nhỏ là cần thiết theo kinh nghiệm cá nhân của mình
- Khi các ứng dụng trong server có nhu cầu sử dụng Ram cao trong thời gian ngắn hạn. ( ví dụ upload file, export excel file, …) thì có thể có trường hợp Ram được sử dụng toàn bộ, dẫn đến tình trạng freeze toàn bộ server, thường phải đợi rất lâu để OS có thể kill bớt một vài program để giải phóng bộ nhớ để server có thể serve request trở lại, hoặc tệ hơn thì sever và phải hard reboot thủ công ( và có thể crash toàn bộ ổ cứng vì chuyện này )
- Với các server có dung lượng Ram cao thì mình thấy chuyện này ít xảy ra hơn, vì không gian Ram trống có vẻ đủ nhiều để không rơi vào các worst case này
What:
Vậy nên cấu hình Swapfile bao nhiêu thì đủ?
- Theo mình thì chỉ nên cấu hình khoản từ 25% đến 50% dung lượng Ram. Vì nó chỉ nên đóng vai trò là bộ nhớ tạm thời, nếu có nhu cầu sử dụng memory nhiều hơn thì nên cân nhắc sử dụng máy có dung lượng ram cao hơn.
- Nếu setup dung lượng swap quá cao thì có thể dẫn đến tình trạng swap chưa cạn mà cpu bị block vì phải đợi tác vụ IO để luân chuyển dữ liệu giữa Ram vs Disk. Một case kinh điển có thể gặp khi sử dụng Aws EC2 với EBS GP2 là khi sử dụng nhiều swap, mà tác vụ io trên disk của EBS bị giới hạn theo cấu hình của GP2, thì một tình trạng rất khó chịu xảy ra là CPU thì rảnh, ( load thấp, nhưng io lại cực kì cao) vì CPU thì đợi Disk trả dữ liệu để swap ra/vào ram, Disk thì lại bị giới hạn năng lực IOPS do giới hạn của loại ổ đĩa, và request từ client thì app ko serve được
How:
sudo fallocate -l 4G /swapfile && \
sudo chmod 600 /swapfile && \
sudo mkswap /swapfile && \
sudo swapon /swapfile && \
sudo swapon -s && \
sudo cp /etc/fstab /etc/fstab.bak && \
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Tham khảo thêm: https://gist.github.com/ngtrieuvi92/033de7ea8c880a9a500bf8df234ca6d2
IV. Cấu hình firewall chỉ để mở các common ports
Why:
Firewall là một chủ đề kinh điển rồi và chắc mình cũng không cần giải thích nhiều, nguyên tắc là mở public càng ít port càng tốt.
What:
Thường thì mình chỉ mở các port ssh, http, https và mở thêm các port khác khi thật sự có nhu cầu
- Trên ubuntu thì có thể sử dụng ufw, hoặc trên các server linux khác hoặc các config phức tạp hơn thì có thể cài đặt và sử dụng iptables
- Trên các cloud thì bạn có thể lười config các bước này và sử dụng các concept setup inbound/oubound/security group do cloud cung cấp để setup, ví dụ Aws: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-security-groups.html
How:
**Với server ubuntu: **
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22 # or custom ssh port
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable
Tham khảo thêm: https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-with-ufw-on-ubuntu-20-04
V. Cấu hình DNS
Why:
Việc này có thể không cần thiết trên một số cloud nổi tiếng ( Aws, GCP, Azure, …) nhưng trên một số nền tảng cung cấp VPS khác. Nếu để với DNS resolver mặc định do OS setup, thì việc Phân giải các domain khá tệ và chập chờn, ( trải nghiệm thực tế của mình với Time4vps hoặc Servarica
What:
Nên sử dụng một số DNS server phổ biến như:
- Google: 8.8.8.8
- Cloudflare: 1.1.1.1
- ….
How:
Cách đơn giản
sudo vi /etc/resolv.conf
Add new line
nameserver 8.8.8.8
nameserver 8.8.4.4
Restart service
service systemd-resolved restart
Sử dụng netplan Netplan là một tiện ích mới được ubuntu giới thiệu từ Ubuntu 17, Netplan cung cấp nhiều tùy chọn để config hơn và có thể apply cho từng network interface riêng biệt, tùy nhu cầu bạn có thể tham khảo cách sử dụng:
- https://www.serverlab.ca/tutorials/linux/administration-linux/how-to-configure-networking-in-ubuntu-20-04-with-netplan/
- https://www.linode.com/docs/guides/systemd-networkd/
VI. Cập nhập các bản update
Why:
Đơn giản: để đảm bảo các package trong hệ thống được update đầy đủ
What:
Cứ Theo package management do OS cung cấp chạy là được
How:
sudo apt update