Một trong những bài toán kiểm soát truy cập phổ biến đối với Linux Administrator đó là quản lý việc các User trên hệ thống đã thao tác những gì khi người dùng SSH vào. Lưu lại toàn bộ log thao tác của người dùng khi SSH vào hệ thống.

1. Phân tích cơ bản

  • Yêu cầu cơ bản log lại toàn bộ thao tác của người dùng khi SSH
  • Tools hỗ trợ chạy trên nhiều OS, chỉ một dòng lệnh hạn chế việc Admin phải cấu hình quá nhiều
  • Khi tạo mới user thì tự động cấu hình luôn phần xử lý đẩy log
  • Security file log

2. Tools cài đặt

Tools được cấu hình dựa trên tính năng của Rsyslog có sẵn trong các OS của linux (CentOS và Ubuntu). Hiện tại mình đã thực hiện xong việc viết tools xử lý các vấn đề trên bao gồm các tính năng cơ bản sau

  • Yêu cầu sudo permission cài đặt
  • Chỉ một thực hiện 1 câu lệnh duy nhất là cấu hình xong
  • Cài đặt được trên toàn bộ CentOS6,7,8, Ubuntu 14,16,18
  • Mỗi khi tạo mới user thì tự động cấu hình logging cmd của user đó lại
  • File log được phân quyền chỉ có mỗi superuser mới có thể xem được
  • Gom các lệnh giống nhau liên tục thành 1 hàng (CentOS8 chưa xử lý được tính năng này, các OS còn lại OK)

Thao tác cấu hình log vô cùng đơn giản bạn chỉ cần SSH vào server với superuser (root hoặc user có quyền sudo) thực thi câu lệnh sau (khuyến cáo dùng root)

curl -Lso- https://raw.githubusercontent.com/nhanhoadocs/ghichep-cmdlog/master/cmdlog.sh | bash
Quá trình setup diễn ra vô cùng nhanh chóng

Sau khi setup xong bạn cần LOGOUT và LOGIN lại phiên SSH. Tiến hành kiểm tra cmdlog tại đường dẫn /var/log/cmdlog.log

Đã thấy log thao tác

Vậy là chúng ta đã hoàn thành cấu hình xong phần cmdlog. Bạn có thể thử tạo mới user và theo dõi xem khi user đó SSH vào thao tác thì log được lưu vào file /var/log/cmdlog.log như thế nào nhé <3.

Đầy đủ sourcecode của tools trên nằm tại đường dẫn GitHub của Nhân Hòa tại https://github.com/nhanhoadocs/ghichep-cmdlog/

3. Chi tiết các bước xử lý tools

Chỗ này các bạn có thể đọc tham khảo để biết mình đã xử lý như thế nào.

Đầu tiên là phần kiểm tra sudo user, kiểm tra OS. Vì ý định của mình là detect OS và tự động cài đặt theo từng OS khác nhau.

# Check sudo user 
if [[ "$EUID" -ne 0 ]]; then 
    echo "Please run as root or sudo"
    exit 1;
fi

# Check OS
echo "Check Your OS"
if cat /etc/*release | grep CentOS > /dev/null 2>&1; then
#....
elif cat /etc/*release | grep ^NAME | grep Ubuntu > /dev/null 2>&1; then
# ....
fi 

Kiểm tra và cài đặt rsyslog

# Check install rsyslog
echo "Check Rsyslog installed"
if [[ $OS == "CentOS" ]]; then 
    if ! rpm -qa | grep rsyslog > /dev/null 2>&1; then
        yum install -y install rsyslog 
    fi 
elif [[ $OS == "Ubuntu" ]]; then 
    if ! dpkg --get-selections | grep rsyslog > /dev/null 2>&1; then
        apt-get -y install rsyslog 
    fi 
fi

Kiểm tra và exit nếu cmdlog đã cấu hình trước đó

# Check config cmdlog
echo "Check old cmdlog config"
if [[ -f "/var/log/cmdlog.log" ]]; then 
    echo "Server have been config CMD log before, Please check your config"
    exit 1;
fi 

Tiếp đến bổ sung cấu hình để đẩy cmdlog cho user đang thao tác (thường là root)

# Config for current user 
echo "Config cmdlog for current user"
touch /var/log/cmdlog.log
chmod 600 /var/log/cmdlog.log

if [[ -d "$HOME" ]] && [[ -f "$HOME/.bashrc" ]]; then 
# ...
fi 

Tiếp đến tự làm khó bản thân với việc xử lý sao cho tạo mới user tự động nhận phần cấu hình cmdlog

# Config for user add 
echo "Config auto cmdlog for new useradd"
if [[ $OS == "CentOS" ]]; then 
# ...
elif [[ $OS == "Ubuntu" ]]; then 
# ...
fi 

Ở phần này mình xử lý phần chỉnh sửa lại cấu hình của /etc/default/useradd và bổ sung, cấu hình các file .bash* trong /etc/skel để mỗi khi create user mới sẽ tự động có file .bashrc đã được config cmdlog

Tiếp đến cấu hình cho rsyslog để xử lý phần lưu file ra log. Ở đây để rút ngắn xử lý cho script mình đã tách các file cấu hình của từng OS khác nhau và thực hiện thao tác cập nhật file config tương ứng.

# Config rsyslog 
echo "Config rsyslog"
mv /etc/rsyslog.{conf,conf.bk}
curl -o /etc/rsyslog.conf https://raw.githubusercontent.com/nhanhoadocs/ghichep-cmdlog/master/config/"$OS_VER"_rsyslog.cnf > /dev/null 2>&1
systemctl restart rsyslog.service > /dev/null 2>&1 || service rsyslog restart > /dev/null 2>&1
source ~/.bashrc

Ok việc cuối cùng cần làm của bạn là LOGOUT và LOGIN lại phiên SSH và tận hưởng thành quả

4. Hướng áp dụng và phát triển

File log này có thể đẩy về log center để tiện monitor theo dõi các thao tác của user trên hệ thống.

  • Tools tạm thời chỉ hỗ trợ Ubuntu14,16,18 và CentOS6,7,8 chưa thử nghiệm và phát triển trên các OS khác.
  • Toosl chưa có action với các user đã tồn tại, không có $HOME folder
  • Tools tạm thời phù hợp với các máy mới cài đặt

Mong nhận được sự đóng góp bổ sung từ các SystemAdmin đồng nghiệp để tools được hoàn thiện hơn.

Các bạn có thể truy cập repo chính của tools này https://github.com/nhanhoadocs/ghichep-cmdlog/ –> Fork repo về github cá nhân bạn –> Bổ sung thêm cấu hình cho các OS khác (Debian, SUSE, …) –> Contribute ngược lại cho cộng đồng (WHY NOT?)