Table of Contents
Kiểm tra thông tin VPS
Xem thông tin tài nguyên hệ thống
$ top top - 05:48:46 up 4:14, 2 users, load average: 0.00, 0.00, 0.00 Tasks: 99 total, 1 running, 57 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.0 us, 0.5 sy, 0.0 ni, 99.3 id, 0.2 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 2040732 total, 1440384 free, 95776 used, 504572 buff/cache KiB Swap: 0 total, 0 free, 0 used. 1793516 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 4443 tungnt 20 0 44576 3844 3200 R 0.5 0.2 0:00.06 top 1 root 20 0 77808 8588 6360 S 0.0 0.4 0:03.37 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H 6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq
$ htop
Xem thông tin hệ điều hành
$ cat /etc/*release
Xem thông tin bộ nhớ RAM
$ free -m
Xem thông tin CPU
$ cat /proc/cpuinfo
Xem thông tin ổ cứng
$ df -h $ du -sh /srv/www/ $ du -sh /srv/www/* | sort -h
Xem danh sách những ip đang kết nối đến server
Kiểm tra xem có IP nào đó đang cố gắng tạo nhiều kết nối để làm chậm server mình hay không bằng lệnh:
$ netstat -anp | grep 'tcp \|udp' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
Kiểm tra xem IP nào đang kết nối nhiều nhất, thông thường với hệ thống nhỏ thì 100 kết nối được xem là đột biết còn với server lớn thì khoảng 300 kết nối. Nếu server của bạn là VPS thì khoảng gần 100 kết nối là được xem là nhiều. Giả sử tôi thấy được IP 74.125.128.94 đang chiếm giữ nhiều kết nối thì việc cần thực hiện trước mắt là chặn IP này lại bằng lệnh:
$ iptables -I INPUT -s 74.125.128.94 -j DROP $ service iptables save
Xem thông tin source list
$ cd /etc/apt/sources.list
Xem file chạy của một lệnh
$ which git #/usr/bin/git
Quản lý Group, User
Kiểm tra tài khoản đang đăng nhập trên hệ thống
$ whoami tungnt
Xem danh sách user trên hệ thống
$ cat /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin tungnt:x:1000:1000:Ubuntu:/home/servertu:/bin/bash
Xem danh sách Group của User
$ groups www-data www-data : www-data
Quản lý Group
# Add group $ groupadd dev # Del group $ groupdel dev # List all group $ cat /etc/group $ groups dev $ sudo groups root # Check ID of Group, User $ id dev uid=1002(dev) gid=1001(dev) groups=1001(dev)
Quản lý User
$ useradd tungnt -c 'Nguyen Thanh Tung' -m -g dev $ passwd tungnt Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully $ cat /etc/passwd tungnt:x:1001:1001:Nguyen Thanh Tung:/home/tungnt:/bin/sh
Update quyền sử dụng dòng lệnh cho user:
tungnt:x:1001:1001:Nguyen Thanh Tung:/home/tungnt:/bin/bash
Cho phép ssh vào tài khoản:
vim /etc/ssh/sshd_config > AllowUsers tungnt dev bayer sudo service ssh reload
Gán full quyền cho user:
Dùng lệnh visudo, thêm dòng tungnt ALL=(ALL:ALL) ALL dưới root ALL=(ALL:ALL) ALL.
$ visudo tungnt ALL=(ALL:ALL) ALL
Add User vào Group:
$ usermod tungnt -g business #chuyen tungnt vao nhom business $ usermod -a -G business tungnt #chuyen tungnt vao nhom business nhung van giu trong nhom dev
Xoá user:
$ userdel tungnt
Phân quyền tập tin và thư mục trên Linux
Cấu trúc của một tập tin, thư mục
Chúng ta sẽ cùng xem cấu trúc của một tập tin, thư mục, chúng ta gõ lệnh sau:
$ ls -la
Ý nghĩa của từng chỉ số:
-rw-r--r-- 1 root root 0 Mar 6 21:04 .autofsck -rw-r--r-- 1 root root 0 Dec 2 11:41 .autorelabel dr-xr-xr-x. 2 root root 4096 Mar 6 21:06 bin dr-xr-xr-x. 4 root root 4096 Dec 2 11:38 boot __________________________________________ ^ ^ ^ ^ ^ ^ ^ ^ ^-- Ngày tháng tạo ra file và tên file | | | | | | | | | | | | | | | \--- Dung lượng của file/folder | | | | | | \-------- Tên group sở hữu | | | | | \--------------- Tên user sở hữu | | | | \---------------------- Hard link, thể hiện nhiều file hoặc thư mục có cùng sử dụng chung inode | | | | | \--\--\----------------------------- Các chỉ số phân quyền \------------------------------------- Loại file (chữ d nghĩa là thư mục)
Phân quyền cho tập tin và thư mục
Linux có 3 quyền cơ bản của 1 user và group đó là:
- r (read) – quyền đọc file/folder
- w (write) – quyền ghi/sửa nội dung file/folder
- x (execute) – quyền thực thi (truy cập) thư mục. Đối với thư mục thì bạn cần phải có quyền execute thì mới dùng lệnh cd để truy cập vào được
- – (Deny) – Không có quyền
Các quyền này cũng được đánh số nhất định:
- r (read) – được biểu diễn bằng số 4.
- w (write) – được biểu diễn bằng số 2.
- x (execute) – được biểu diễn bằng số 1.
- – (Deny) – được biểu diễn bằng số 0
Cấu trúc chỉ số phân quyền:
- owner: Quyền của user mà chủ sở hữu của file này.
- group: Quyền của những users thuộc group mà chủ sở hữu của file này.
- other: Quyền của tất cả các user khác trên máy.
Để có thể thay đổi các chỉ số phân quyền này ta sẽ dử dụng lệnh chmod:
$ chmod <tùy chọn> <chỉ số phân quyền> <tên tập tin/thư mục>
Các tùy chọn:
- -v : Hiển thị báo cáo sau khi chạy lệnh, mỗi lần đổi quyền là hiển thị một lần
- -c : Giống như trên, nhưng chỉ hiện khi nó đã làm xong tất cả.
- -R : Áp dụng luôn vào các file/folder nằm bên trong folder được phân quyền (chỉ áp dụng cho thư mục)
Ví dụ:
# chmod 777 test1 <Cấp quyền truy cập đầy đủ cho mọi đối tượng người dùng.> # chmod 775 test1 <Cấp quyền truy cập đầy đủ cho chủ hệ thống và nhóm quản trị, đối tượng người dùng chỉ có quyền đọc (read) và chạy (execute) file.> # chmod 755 test1 <Cấp quyền truy cập đầy đủ cho chủ hệ thống, chỉ cho phép nhóm quản trị và đối tượng người dùng đọc và chạy các file trong thư mục.> # chmod 700 test1 <Chỉ cấp quyền truy cập đầy đủ cho chủ hệ thống và chặn truy cập với mọi đối tượng khác.> # chmod 500 test1 <Không cho phép nhóm quản trị và người dùng truy cập vào file trong thư mục, đồng thời giới hạn quyền chủ hệ thống chỉ đọc và chạy để tránh xóa và thay đổi các file trong thư mục này.> # chmod 660 test1 <Cho phép chủ hệ thống và nhóm quản trị đọc, sửa, xóa và ghi dữ liệu vào file, nhưng không phân quyền truy cập cho những người dùng khác.>
Thay đổi chủ sở hữu cho tập tin và thư mục
Mặc định tập tin và thư mục đều có user group riêng của nó, nếu muốn thay đổi dùng lệnh chown:
# chown <tùy chọn> <tên user>:<tên group> <tên tập tin/thư mục>
Các tùy chọn:
- -v : Hiển thị báo cáo sau khi chạy lệnh, mỗi lần đổi chủ sở hữu là hiển thị một lần
- -c : Giống như trên, nhưng chỉ hiện khi nó đã làm xong tất cả.
- -R : Áp dụng luôn vào các file/folder nằm bên trong folder được đổi chủ (chỉ áp dụng cho thư mục)
Ví dụ:
# chown paste:paste test1 <Thay đổi cả user và group cho test1> # chown paste test1 <Thay đổi user cho test1> # chown :paste test1 <Thay đổi group cho test1>
Cấu hình bảo mật VPS
Thay đổi mật khẩu tài khoản root, tạo tài khoản mới để login vào VPS
Đăng nhập tài khoản root, đổi mật khẩu bằng lệnh passwd.
Tạo tài khoản mới và gán quyền như tài khoản root. Xem phần quản lý User, Group.
Thay đổi port ssh mặc định
Tất cả các vps/server khi được tạo đều sử dụng port 22 làm cổng dành cho kết nối SSH, chúng ta thay bằng port khác. Port này có giá trị từ 1025 đến 65536.
$ vim /etc/ssh/sshd_config #Port 22 #AddressFamily any #ListenAddress 0.0.0.0 #ListenAddress :: Port 2200 #LoginGraceTime 2m #PermitRootLogin prohibit-password #StrictModes yes #MaxAuthTries 6 #MaxSessions 10 PermitRootLogin No #UseDNS no #PidFile /var/run/sshd.pid #MaxStartups 10:30:100 #PermitTunnel no #ChrootDirectory none #VersionAddendum none UseDNS no AllowUsers tungnt
PermitRootLogin: No: Thay đổi này không cho tài khoản root đăng nhập vào VPS nữa. UseDNS no và AllowUsers tungnt: cho user mới được quyền đăng nhập
Sau khi hoàn thành các bước trên reboot lại server.
Lệnh SSH mới:
$ ssh tungnt@ip_vps -p 2200
https://www.cybrosys.com/blog/how-to-setup-sftp-server-on-ubuntu-20-04
Cài đặt ứng dụng
Update phiên bản mới nhất
$ apt-get update
Các ứng dụng cơ bản
$ apt-get install vim htop default-jre default-jdk
Git
Cài đặt:
$ apt-get install git
Nginx
$ apt-get install nginx $ service nginx status $ service nginx start
https://tecadmin.net/install-multiple-php-version-nginx-ubuntu/
MySQL
$ apt-get install mysql-server
Error connecting to MySQL: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'
1. Kiểm tra sự tồn tại của file mysql.sock
[root@TungNT]# ls -la /var/lib/mysql/mysql.sock ls: cannot access /var/lib/mysql/mysql.sock: No such file or directory
2. Kiểm tra nếu sự thiết lập ( trong file my.cnf ) đã thay đổi đường dẫn của file mysql.sock .
[root@TungNT]# netstat -lnp | grep mysql tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 25151/mysqld unix 2 [ ACC ] STREAM LISTENING 27600272 25151/mysqld /var/lib/mysql/mysql.sock
3. Kiểm tra sự hoạt động dịch vụ mysql
[root@TungNT]# ps ax | grep mysql 16343 ? S 0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --pid-file=/var/lib/mysql/tenten.myvps.vn.pid 16653 ? Sl 2:50 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/lib/mysql/tenten.myvps.vn.err --open-files-limit=8192 --pid-file=/var/lib/mysql/tenten.myvps.vn.pid 19786 pts/1 S+ 0:00 grep mysql
4. Khởi động lại dịch vụ mysql nhằm mục đích khởi tạo lại file mysql.sock.
Cách 1:
[root@TungNT ~]# /etc/init.d/mysqld stop Shutting down MySQL............................ SUCCESS! [root@TungNT ~]# /etc/init.d/mysqld start Starting MySQL.............................. SUCCESS! [root@TungNT ~]# ls -la /var/lib/mysql/mysql.sock srwxrwxrwx 1 mysql mysql 0 Sep 29 10:32 /var/lib/mysql/mysql.sock
Cách 2:
[root@TungNT ~]# killall -9 mysqld mysqld_safe [root@TungNT ~]# /etc/init.d/mysqld start Starting MySQL.............................. SUCCESS! [root@TungNT ~]# ls -la /var/lib/mysql/mysql.sock srwxrwxrwx 1 mysql mysql 0 Sep 29 10:32 /var/lib/mysql/mysql.sock
PHP FPM
$ apt-get install software-properties-common python-software-properties $ add-apt-repository ppa:ondrej/php $ apt-get update $ apt-get install php-fpm php-mysql $ apt-get install php-common php-mbstring php-xml php7.0-gmp php7.0-curl
Kiểm tra thông tin PHP:
$ php -v $ php --ini php -m | grep opentelemetry
Cấu hình:
$ vim /etc/php/7.2/fpm/pool.d/www.conf ... user = www group = dev ... listen = 127.0.0.1:9000 ...
Cấu hình vitrual host:
server { listen 80; root /srv/www/domain.com/; index index.php; server_name domain.com; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { try_files $uri = 404; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
Install Multiple PHP Versions:
apt-get install software-properties-common gnupg2 -y add-apt-repository ppa:ondrej/php apt-get update -y apt-get install php7.2 php7.2-fpm php7.2-cli -y apt-get install php7.4 php7.4-fpm php7.4-cli -y apt-get install php8.0 php8.0-fpm php8.0-cli -y apt-get install php8.1 php8.1-fpm php8.1-cli -y php --version # Set the Default PHP Version: update-alternatives --config php
Switch Between Multiple PHP Versions with Nginx:
- nginx.conf
server { listen 80; server_name template.1site.vn api-template.1site.vn cms-template.1site.vn; root /var/www/1site/template.1site.vn/public/; index index.php index.html index.htm; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { try_files $uri = 404; fastcgi_pass 127.0.0.1:9082; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
fastcgi_pass 127.0.0.1:9082; ⇒ Version PHP
- /opt/homebrew/etc/php/8.2/php-fpm.d/www.conf
... ; The address on which to accept FastCGI requests. ; Valid syntaxes are: ; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on ; a specific port; ; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on ; a specific port; ; 'port' - to listen on a TCP socket to all addresses ; (IPv6 and IPv4-mapped) on a specific port; ; '/path/to/unix/socket' - to listen on a unix socket. ; Note: This value is mandatory. listen = 127.0.0.1:9082 ...
Supervisor
Cài đặt:
$ apt-get install supervisor
Kiểm tra trạng thái:
$ service supervisor status
Cấu hình:
$ vim /etc/supervisor/conf.d/domain.com.conf [program:api.9pay.vn-worker] process_name=%(program_name)s_%(process_num)02d command=php /path/artisan queue:listen autostart=true autorestart=true user=tungnt numprocs=10 redirect_stderr=true stdout_logfile=/path/storage/logs/worker.log
Wget: Download HTML Template Free
wget -r -E -H -k -p -np -e robots=off -P /home/downloadhtmlfree.com -D nhaphangquangchau.vn,bizweb.dktcdn.net http://nhaphangquangchau.vn wget \ --recursive \ --no-clobber \ --page-requisites \ --html-extension \ --convert-links \ --restrict-file-names=windows \ --domains astritbublaku.com \ --no-parent \ http://astritbublaku.com/demos/albertos wget \ -e robots=off \ --recursive \ --no-clobber \ --page-requisites \ --html-extension \ --convert-links \ --restrict-file-names=windows \ --domains demos.themeselection.com \ --no-parent \ https://demos.themeselection.com/materio-bootstrap-html-admin-template/html/vertical-menu-template/app-email.html
Trong đó:
- recursive: tải xuống toàn bộ trang web.
- domains website.org: không theo các liên kết bên ngoài website.org.
- no-parent: không theo các liên kết bên ngoài các hướng dẫn thư mục / html /.
- page-requisites: nhận tất cả các yếu tố soạn trang (hình ảnh, CSS, v.v.).
- html-extension: lưu tệp bằng phần mở rộng .html.
- convert-links: chuyển đổi các liên kết để chúng hoạt động cục bộ, ngoại tuyến.
- restrict-file-names = windows: sửa đổi tên tập tin để chúng cũng hoạt động trong Windows.
- no-clobber: không ghi đè lên bất kỳ tệp hiện có nào (được sử dụng trong trường hợp tải xuống bị gián đoạn và tiếp tục).
Lệnh xoá tiến trình
ps aux | grep manage.py ps -ef | grep "manage.py" | awk '{print $2}' ps -ef | grep "manage.py" | awk '{print $2}' | xargs kill -9 $2
Tạo Swap
$ /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024 1024+0 records in 1024+0 records out 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 9.77543 s, 110 MB/s $ /sbin/mkswap /var/swap.1 mkswap: /var/swap.1: insecure permissions 0644, 0600 suggested. Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes) no label, UUID=61d06055-5c32-49f7-8e1a-0638978c20f3 $ /sbin/swapon /var/swap.1 swapon: /var/swap.1: insecure permissions 0644, 0600 suggested. $ free -m total used free shared buff/cache available Mem: 1992 360 78 13 1554 1441 Swap: 1023 0 1023
SCP
https://linuxize.com/post/how-to-use-scp-command-to-securely-transfer-files/
scp -P 1618 test.zip tungnt@149.28.140.46:/tmp scp -P 1618 tungnt@149.28.140.46:/tmp/test.tar test.tar
HTTPs
mkcert
https://github.com/FiloSottile/mkcert
tungnt@TungNT Downloads % mkcert local-cms.9x.vn local.9x.vn local-api.9x.vn Using the local CA at "/Users/tungnt/Library/Application Support/mkcert" ✨ Created a new certificate valid for the following names 📜 - "local-cms.9x.vn" - "local.9x.vn" - "local-api.9x.vn" The certificate is at "./local-cms.9x.vn+2.pem" and the key at "./local-cms.9x.vn+2-key.pem" ✅
Cấu hình nginx:
server { listen 443 ssl; server_name local.9x.vn; root /var/www/9x/local.9x.vn/public/; index index.php index.html index.htm; add_header 'Access-Control-Allow-Origin' "*"; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE, PUT'; add_header 'Access-Control-Allow-Credentials' 'true'; #add_header 'Access-Control-Allow-Headers' 'User-Agent,Keep-Alive,Content-Type'; add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; ssl_certificate /Users/tungnt/Downloads/local-cms.9x.vn+2.pem; ssl_certificate_key /Users/tungnt/Downloads/local-cms.9x.vn+2-key.pem; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { try_files $uri = 404; fastcgi_pass 127.0.0.1:9001; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
certbot
certbot --nginx -d test.com -d www.test.com sudo certbot delete
TLS checker
Bash file example
- gc
#! /bin/bash MESSAGE="$1" sudo git commit -am "$MESSAGE"
Cron job
Cấu trúc: minute hour day_of_month month day_of_week command_to_run
Trong đó:
- minute: 0-59
- hour: 0-23
- Field Allowed Values
- minute 0-59
- hour 0-23
- day_of_month: 1-31
- month: 1-12 or JAN-DEC
- day_of_week: 0-6 or SUN-SAT
- command_to_run: job
Ví dụ:
30 17 * * 2 curl http://www.google.com
Cài đặt job:
crontab -e # Here are some more examples of how to use cron’s scheduling component: * * * * * - Run the command every minute. 12 * * * * - Run the command 12 minutes after every hour. 0,15,30,45 * * * * - Run the command every 15 minutes. */15 * * * * - Run the command every 15 minutes. 0 4 * * * - Run the command every day at 4:00 AM. 0 4 * * 2-4 - Run the command every Tuesday, Wednesday, and Thursday at 4:00 AM. 20,40 */8 * 7-12 * - Run the command on the 20th and 40th minute of every 8th hour every day of the last 6 months of the year.
Tham khảo: https://www.digitalocean.com/community/tutorials/how-to-use-cron-to-automate-tasks-ubuntu-1804