👤 User & Database Management Scripts
Các scripts trong phần này giúp bạn quản lý tài khoản người dùng, backup và quản trị database một cách hiệu quả.
💾 1. Script Backup Database
Backup MySQL/MariaDB
#!/bin/bash
# backup_mysql.sh - Backup MySQL/MariaDB databases
# Cấu hình Database
DB_USER="backup_user"
DB_PASS="your_password"
DB_HOST="localhost"
DB_PORT="3306"
# Cấu hình Backup
BACKUP_DIR="/backup/mysql"
DATE=$(date +"%Y%m%d_%H%M%S")
LOG_FILE="/var/log/mysql_backup.log"
MAX_BACKUPS=14 # Giữ lại 14 bản backup
COMPRESSION=true
# Hàm ghi log
log_message() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}
# Tạo thư mục backup
mkdir -p "$BACKUP_DIR"
# Lấy danh sách databases (loại trừ system databases)
DATABASES=$(mysql -u"$DB_USER" -p"$DB_PASS" -h"$DB_HOST" -P"$DB_PORT" -e "SHOW DATABASES;" | grep -Ev "^(Database|information_schema|performance_schema|mysql|sys)$")
log_message "Bắt đầu backup MySQL databases"
# Backup từng database
for DB in $DATABASES; do
log_message "Backup database: $DB"
BACKUP_FILE="$BACKUP_DIR/${DB}_${DATE}.sql"
# Thực hiện backup
if mysqldump -u"$DB_USER" -p"$DB_PASS" -h"$DB_HOST" -P"$DB_PORT" \
--single-transaction --routines --triggers "$DB" > "$BACKUP_FILE"; then
# Nén file nếu được cấu hình
if [ "$COMPRESSION" = true ]; then
gzip "$BACKUP_FILE"
BACKUP_FILE="${BACKUP_FILE}.gz"
fi
BACKUP_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
log_message "SUCCESS: Backup $DB hoàn thành ($BACKUP_SIZE)"
else
log_message "ERROR: Backup $DB thất bại"
rm -f "$BACKUP_FILE"
fi
done
# Backup tất cả databases trong một file
log_message "Tạo backup tổng hợp tất cả databases"
ALL_DB_FILE="$BACKUP_DIR/all_databases_${DATE}.sql"
if mysqldump -u"$DB_USER" -p"$DB_PASS" -h"$DB_HOST" -P"$DB_PORT" \
--single-transaction --routines --triggers --all-databases > "$ALL_DB_FILE"; then
if [ "$COMPRESSION" = true ]; then
gzip "$ALL_DB_FILE"
ALL_DB_FILE="${ALL_DB_FILE}.gz"
fi
BACKUP_SIZE=$(du -h "$ALL_DB_FILE" | cut -f1)
log_message "SUCCESS: Backup tổng hợp hoàn thành ($BACKUP_SIZE)"
else
log_message "ERROR: Backup tổng hợp thất bại"
rm -f "$ALL_DB_FILE"
fi
# Dọn dẹp backup cũ
log_message "Dọn dẹp backup cũ (giữ lại $MAX_BACKUPS bản gần nhất)"
cd "$BACKUP_DIR" || exit 1
find . -name "*.sql*" -type f -mtime +$MAX_BACKUPS -delete
log_message "MySQL backup script hoàn thành"
Backup PostgreSQL
#!/bin/bash
# backup_postgresql.sh - Backup PostgreSQL databases
# Cấu hình Database
export PGUSER="backup_user"
export PGPASSWORD="your_password"
export PGHOST="localhost"
export PGPORT="5432"
# Cấu hình Backup
BACKUP_DIR="/backup/postgresql"
DATE=$(date +"%Y%m%d_%H%M%S")
LOG_FILE="/var/log/postgresql_backup.log"
MAX_BACKUPS=14
COMPRESSION=true
# Hàm ghi log
log_message() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}
# Tạo thư mục backup
mkdir -p "$BACKUP_DIR"
# Lấy danh sách databases (loại trừ template databases)
DATABASES=$(psql -t -c "SELECT datname FROM pg_database WHERE NOT datistemplate AND datname != 'postgres';" | grep -v '^$')
log_message "Bắt đầu backup PostgreSQL databases"
# Backup từng database
for DB in $DATABASES; do
DB=$(echo $DB | xargs) # Trim whitespace
log_message "Backup database: $DB"
BACKUP_FILE="$BACKUP_DIR/${DB}_${DATE}.sql"
# Thực hiện backup
if pg_dump "$DB" > "$BACKUP_FILE"; then
# Nén file nếu được cấu hình
if [ "$COMPRESSION" = true ]; then
gzip "$BACKUP_FILE"
BACKUP_FILE="${BACKUP_FILE}.gz"
fi
BACKUP_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
log_message "SUCCESS: Backup $DB hoàn thành ($BACKUP_SIZE)"
else
log_message "ERROR: Backup $DB thất bại"
rm -f "$BACKUP_FILE"
fi
done
# Backup tất cả databases
log_message "Tạo backup tổng hợp tất cả databases"
ALL_DB_FILE="$BACKUP_DIR/all_databases_${DATE}.sql"
if pg_dumpall > "$ALL_DB_FILE"; then
if [ "$COMPRESSION" = true ]; then
gzip "$ALL_DB_FILE"
ALL_DB_FILE="${ALL_DB_FILE}.gz"
fi
BACKUP_SIZE=$(du -h "$ALL_DB_FILE" | cut -f1)
log_message "SUCCESS: Backup tổng hợp hoàn thành ($BACKUP_SIZE)"
else
log_message "ERROR: Backup tổng hợp thất bại"
rm -f "$ALL_DB_FILE"
fi
# Dọn dẹp backup cũ
log_message "Dọn dẹp backup cũ (giữ lại $MAX_BACKUPS bản gần nhất)"
cd "$BACKUP_DIR" || exit 1
find . -name "*.sql*" -type f -mtime +$MAX_BACKUPS -delete
log_message "PostgreSQL backup script hoàn thành"
👥 2. Script Quản Lý Người Dùng
Tạo Người Dùng Hàng Loạt
#!/bin/bash
# batch_user_create.sh - Tạo người dùng hàng loạt từ file CSV
# Cấu hình
USER_FILE="/path/to/users.csv"
LOG_FILE="/var/log/user_management.log"
DEFAULT_PASSWORD="ChangeMe123!" # Password mặc định ban đầu
DEFAULT_SHELL="/bin/bash"
FORCE_PASSWORD_CHANGE=true # Bắt buộc đổi password khi đăng nhập lần đầu
# Hàm ghi log
log_message() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}
# Kiểm tra quyền root
if [ "$(id -u)" -ne 0 ]; then
log_message "ERROR: Script này cần chạy với quyền root"
exit 1
fi
# Kiểm tra file CSV
if [ ! -f "$USER_FILE" ]; then
log_message "ERROR: File $USER_FILE không tồn tại"
exit 1
fi
log_message "Bắt đầu tạo người dùng từ file $USER_FILE"
# Đọc file CSV và tạo người dùng
# Format CSV: username,full_name,group,home_directory,shell
line_num=0
while IFS=, read -r username full_name group home_dir shell; do
line_num=$((line_num + 1))
# Bỏ qua dòng header
if [ $line_num -eq 1 ] && [ "$username" = "username" ]; then
continue
fi
# Loại bỏ khoảng trắng
username=$(echo "$username" | xargs)
full_name=$(echo "$full_name" | xargs)
group=$(echo "$group" | xargs)
home_dir=$(echo "$home_dir" | xargs)
shell=$(echo "$shell" | xargs)
# Sử dụng giá trị mặc định nếu không có
if [ -z "$shell" ]; then
shell="$DEFAULT_SHELL"
fi
if [ -z "$home_dir" ]; then
home_dir="/home/$username"
fi
log_message "Đang tạo người dùng: $username"
# Tạo group nếu chưa tồn tại
if [ -n "$group" ] && ! getent group "$group" > /dev/null; then
groupadd "$group"
log_message "Đã tạo group: $group"
fi
# Tạo người dùng
if id "$username" &>/dev/null; then
log_message "WARNING: Người dùng $username đã tồn tại, bỏ qua"
continue
fi
# Tạo user với group
if [ -n "$group" ]; then
useradd -m -c "$full_name" -d "$home_dir" -s "$shell" -g "$group" "$username"
else
useradd -m -c "$full_name" -d "$home_dir" -s "$shell" "$username"
fi
# Đặt password
echo "$username:$DEFAULT_PASSWORD" | chpasswd
# Bắt buộc đổi password khi đăng nhập lần đầu
if [ "$FORCE_PASSWORD_CHANGE" = true ]; then
passwd -e "$username"
fi
log_message "SUCCESS: Đã tạo người dùng $username"
done < "$USER_FILE"
log_message "Hoàn thành tạo người dùng hàng loạt"
Kiểm Tra Quyền Truy Cập
#!/bin/bash
# user_access_audit.sh - Kiểm tra quyền truy cập của người dùng
# Cấu hình
LOG_FILE="/var/log/user_audit.log"
REPORT_FILE="/var/log/user_access_report.txt"
CRITICAL_GROUPS=("sudo" "wheel" "admin" "docker")
INACTIVE_DAYS=90 # Số ngày không hoạt động để coi là tài khoản không sử dụng
# Hàm ghi log
log_message() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}
# Kiểm tra quyền root
if [ "$(id -u)" -ne 0 ]; then
log_message "ERROR: Script này cần chạy với quyền root"
exit 1
fi
# Tạo file báo cáo mới
echo "=== BÁO CÁO KIỂM TRA QUYỀN TRUY CẬP NGƯỜI DÙNG ===" > "$REPORT_FILE"
echo "Thời gian: $(date)" >> "$REPORT_FILE"
echo "Máy chủ: $(hostname)" >> "$REPORT_FILE"
echo "" >> "$REPORT_FILE"
# Kiểm tra người dùng có quyền sudo
echo "=== NGƯỜI DÙNG CÓ QUYỀN SUDO ===" >> "$REPORT_FILE"
for group in "${CRITICAL_GROUPS[@]}"; do
if getent group "$group" > /dev/null; then
echo "Thành viên của group $group:" >> "$REPORT_FILE"
members=$(getent group "$group" | cut -d: -f4)
if [ -z "$members" ]; then
echo " Không có thành viên" >> "$REPORT_FILE"
else
echo "$members" | tr ',' '\n' | sed 's/^/ - /' >> "$REPORT_FILE"
fi
echo "" >> "$REPORT_FILE"
fi
done
# Kiểm tra file sudoers
echo "=== CẤU HÌNH SUDOERS ===" >> "$REPORT_FILE"
echo "Nội dung file /etc/sudoers (chỉ các dòng không comment):" >> "$REPORT_FILE"
grep -v '^#' /etc/sudoers | grep -v '^$' | sed 's/^/ /' >> "$REPORT_FILE"
echo "" >> "$REPORT_FILE"
echo "Nội dung thư mục /etc/sudoers.d/:" >> "$REPORT_FILE"
if [ -d "/etc/sudoers.d" ]; then
for file in /etc/sudoers.d/*; do
if [ -f "$file" ] && [ "$(basename "$file")" != "README" ]; then
echo " File: $file" >> "$REPORT_FILE"
grep -v '^#' "$file" | grep -v '^$' | sed 's/^/ /' >> "$REPORT_FILE"
fi
done
else
echo " Thư mục không tồn tại" >> "$REPORT_FILE"
fi
echo "" >> "$REPORT_FILE"
# Kiểm tra tài khoản không sử dụng
echo "=== TÀI KHOẢN KHÔNG SỬ DỤNG ===" >> "$REPORT_FILE"
echo "Tài khoản không đăng nhập trong $INACTIVE_DAYS ngày:" >> "$REPORT_FILE"
lastlog_output=$(lastlog -b "$INACTIVE_DAYS")
if [ -z "$lastlog_output" ]; then
echo " Không có tài khoản không hoạt động" >> "$REPORT_FILE"
else
echo "$lastlog_output" | grep -v "Never logged in" | sed 's/^/ /' >> "$REPORT_FILE"
fi
echo "" >> "$REPORT_FILE"
# Kiểm tra tài khoản không có password
echo "=== TÀI KHOẢN KHÔNG CÓ PASSWORD ===" >> "$REPORT_FILE"
for user in $(cut -d: -f1 /etc/passwd); do
passwd_status=$(passwd -S "$user" 2>/dev/null)
if echo "$passwd_status" | grep -q "NP"; then
echo " - $user" >> "$REPORT_FILE"
fi
done
echo "" >> "$REPORT_FILE"
# Kiểm tra SSH authorized_keys
echo "=== SSH AUTHORIZED KEYS ===" >> "$REPORT_FILE"
for user_home in /home/*; do
if [ -d "$user_home" ]; then
user=$(basename "$user_home")
ssh_dir="$user_home/.ssh"
auth_keys="$ssh_dir/authorized_keys"
if [ -f "$auth_keys" ]; then
key_count=$(wc -l < "$auth_keys")
echo "Người dùng $user: $key_count SSH keys" >> "$REPORT_FILE"
# Liệt kê fingerprint của các keys
while read -r key; do
if [ -n "$key" ] && [[ ! "$key" =~ ^# ]]; then
echo " - $(echo "$key" | ssh-keygen -lf - 2>/dev/null || echo "Invalid key format")" >> "$REPORT_FILE"
fi
done < "$auth_keys"
fi
fi
done
echo "" >> "$REPORT_FILE"
log_message "Đã tạo báo cáo kiểm tra quyền truy cập tại $REPORT_FILE"
echo "Báo cáo đã được tạo tại $REPORT_FILE"
🔐 3. Script Quản Lý Database
Tạo Database v à User
#!/bin/bash
# create_db_user.sh - Tạo database và user MySQL/MariaDB
# Cấu hình
DB_ADMIN_USER="root"
DB_ADMIN_PASS="your_root_password"
LOG_FILE="/var/log/db_management.log"
# Hàm ghi log
log_message() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}
# Hàm tạo database và user
create_db_user() {
local db_name="$1"
local user_name="$2"
local user_pass="$3"
local host="$4"
# Tạo database
mysql -u"$DB_ADMIN_USER" -p"$DB_ADMIN_PASS" -e "CREATE DATABASE IF NOT EXISTS \\`$db_name\\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
if [ $? -eq 0 ]; then
log_message "SUCCESS: Đã tạo database $db_name"
else
log_message "ERROR: Không thể tạo database $db_name"
return 1
fi
# Tạo user
mysql -u"$DB_ADMIN_USER" -p"$DB_ADMIN_PASS" -e "CREATE USER IF NOT EXISTS '$user_name'@'$host' IDENTIFIED BY '$user_pass';"
if [ $? -eq 0 ]; then
log_message "SUCCESS: Đã tạo user $user_name@$host"
else
log_message "ERROR: Không thể tạo user $user_name@$host"
return 1
fi
# Cấp quyền
mysql -u"$DB_ADMIN_USER" -p"$DB_ADMIN_PASS" -e "GRANT ALL PRIVILEGES ON \\`$db_name\\`.* TO '$user_name'@'$host';"
if [ $? -eq 0 ]; then
log_message "SUCCESS: Đã cấp quy ền cho $user_name@$host trên database $db_name"
else
log_message "ERROR: Không thể cấp quyền cho $user_name@$host"
return 1
fi
# Áp dụng thay đổi
mysql -u"$DB_ADMIN_USER" -p"$DB_ADMIN_PASS" -e "FLUSH PRIVILEGES;"
return 0
}
# Kiểm tra tham số
if [ $# -lt 3 ]; then
echo "Usage: $0 <database_name> <user_name> <user_password> [host]"
echo "Example: $0 myapp myapp_user password123 localhost"
exit 1
fi
DB_NAME="$1"
USER_NAME="$2"
USER_PASS="$3"
HOST="${4:-localhost}" # Mặc định là localhost nếu không có tham số thứ 4
log_message "Bắt đầu tạo database $DB_NAME và user $USER_NAME@$HOST"
# Tạo database và user
if create_db_user "$DB_NAME" "$USER_NAME" "$USER_PASS" "$HOST"; then
log_message "Hoàn thành tạo database và user"
echo "Database $DB_NAME và user $USER_NAME@$HOST đã được tạo thành công"
else
log_message "Thất bại khi tạo database và user"
echo "Có lỗi xảy ra khi tạo database và user. Xem log tại $LOG_FILE"
exit 1
fi
Kiểm Tra Quyền Database
#!/bin/bash
# db_permissions_audit.sh - Kiểm tra quyền truy cập database
# Cấu hình
DB_ADMIN_USER="root"
DB_ADMIN_PASS="your_root_password"
LOG_FILE="/var/log/db_audit.log"
REPORT_FILE="/var/log/db_permissions_report.txt"
# Hàm ghi log
log_message() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}
# Tạo file báo cáo mới
echo "=== BÁO CÁO KIỂM TRA QUYỀN DATABASE ===" > "$REPORT_FILE"
echo "Thời gian: $(date)" >> "$REPORT_FILE"
echo "Máy chủ: $(hostname)" >> "$REPORT_FILE"
echo "" >> "$REPORT_FILE"
# Lấy danh sách users
echo "=== DANH SÁCH USERS ===" >> "$REPORT_FILE"
mysql -u"$DB_ADMIN_USER" -p"$DB_ADMIN_PASS" -e "SELECT user, host FROM mysql.user;" | sed 's/^/ /' >> "$REPORT_FILE"
echo "" >> "$REPORT_FILE"
# Kiểm tra quyền của từng user
echo "=== QUYỀN CỦA USERS ===" >> "$REPORT_FILE"
users=$(mysql -u"$DB_ADMIN_USER" -p"$DB_ADMIN_PASS" -e "SELECT CONCAT(user, '@', host) FROM mysql.user;" | grep -v "CONCAT")
for user_host in $users; do
echo "Quyền của user $user_host:" >> "$REPORT_FILE"
mysql -u"$DB_ADMIN_USER" -p"$DB_ADMIN_PASS" -e "SHOW GRANTS FOR $user_host;" | sed 's/^/ /' >> "$REPORT_FILE"
echo "" >> "$REPORT_FILE"
done
# Kiểm tra users có quyền SUPER hoặc ALL PRIVILEGES
echo "=== USERS CÓ QUYỀN CAO ===" >> "$REPORT_FILE"
echo "Users có quyền SUPER:" >> "$REPORT_FILE"
mysql -u"$DB_ADMIN_USER" -p"$DB_ADMIN_PASS" -e "SELECT user, host FROM mysql.user WHERE Super_priv = 'Y';" | sed 's/^/ /' >> "$REPORT_FILE"
echo "" >> "$REPORT_FILE"
echo "Users có quyền ALL PRIVILEGES trên tất cả databases:" >> "$REPORT_FILE"
for user_host in $users; do
grants=$(mysql -u"$DB_ADMIN_USER" -p"$DB_ADMIN_PASS" -e "SHOW GRANTS FOR $user_host;" | grep -i "ALL PRIVILEGES ON \*\.\*")
if [ -n "$grants" ]; then
echo " $user_host" >> "$REPORT_FILE"
fi
done
echo "" >> "$REPORT_FILE"
# Kiểm tra anonymous users
echo "=== ANONYMOUS USERS ===" >> "$REPORT_FILE"
mysql -u"$DB_ADMIN_USER" -p"$DB_ADMIN_PASS" -e "SELECT host FROM mysql.user WHERE user='';" | grep -v "host" | sed 's/^/ /' >> "$REPORT_FILE"
echo "" >> "$REPORT_FILE"
log_message "Đã tạo báo cáo kiểm tra quyền database tại $REPORT_FILE"
echo "Báo cáo đã được tạo tại $REPORT_FILE"
⚙️ 4. Cấu Hình và Lưu Ý
Cấu Hình Cron Jobs
# Mở crontab editor
crontab -e
# Thêm các dòng sau:
# Backup MySQL hàng ngày lúc 3:00 AM
0 3 * * * /path/to/backup_mysql.sh
# Backup PostgreSQL hàng ngày lúc 4:00 AM
0 4 * * * /path/to/backup_postgresql.sh
# Kiểm tra quyền truy cập hàng tuần vào Chủ nhật lúc 5:00 AM
0 5 * * 0 /path/to/user_access_audit.sh
# Kiểm tra quyền database hàng tháng vào ngày 1 lúc 6:00 AM
0 6 1 * * /path/to/db_permissions_audit.sh
Quyền và Bảo Mật
# Cấp quyền thực thi cho scripts
chmod +x *.sh
# Đặt quyền sở hữu cho user admin
chown admin:admin *.sh
# Bảo vệ file chứa mật khẩu
chmod 600 /path/to/config/db_credentials
# Tạo user riêng cho backup
useradd -r -s /bin/bash backup