Linux记录终端用户行为的一种审计方法
Linux 下用户行为审计的一种方法
Linux 提供了一种可以对用户的行为进行记录和重放的方法。这种方法对于比较重要的环境下的审计以及问题的处理,有比较广泛的使用。
启用行为记录
下面是一个启用该功能的 shell 脚本:
#!/bin/bash
mkdir -p /var/log/session
# Define the block to be added to /etc/profile
block='
if [ "x$SESSION_RECORD" = "x" ]
then
timestamp=$(date +%d-%m-%Y-%T)
session_log=/var/log/session/session.$USER.$timestamp.log
SESSION_RECORD=started
export SESSION_RECORD
script -t -f -q 2>${session_log}.timing $session_log
exit
fi
'
# Add the block to /etc/profile
echo "$block" | sudo tee -a /etc/profile > /dev/null
# Source the profile to apply the changes
source /etc/profile
上面脚本的目的如下:
- 以管理员账户运行该脚本,创建/var/log/session 目录。
- 如果用户 session 记录没有启用,那么开始进行参数定义
- 设定 timestamp 格式,这个格式可以自己进行修改,不影响功能
- 设定 session 日志的文件位置和命名格式
- 启动 session 记录
- 生成带有时间的脚本
- 将上面的这些指令放到/etc/profile 中,并进行更新。
- 从此以后,所有终端登录到这台 Linux 机器的人,他们的所有的输入和输出都会被记录到对应的文件中,并且可以进行回放。
发送记录
发送到审计人的邮箱或者使用 scp 进行传输到其他地方这个是可选的。只是发送到邮箱更简单一些,方便其他人更好的进行外部审计。
由于 shell 发送邮件在不同的操作系统中命令的格式略有不同,所以下面以 python 代码的形式实现,方便统一。
下面是使用 python 代码发送用户行为日志的脚本:
import os
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
import zipfile
def send_email(sender, password, recipients, subject, body, attachment_folder, smtp_server, smtp_port):
# Create a multipart message
message = MIMEMultipart()
message['From'] = sender
message['To'] = ', '.join(recipients)
message['Subject'] = subject
# Add body to the email
message.attach(MIMEText(body, 'plain'))
# Create a zip file
zip_filename = 'attachments.zip'
with zipfile.ZipFile(zip_filename, 'w') as zip_file:
# Iterate through files in the attachment folder
for filename in os.listdir(attachment_folder):
attachment_path = os.path.join(attachment_folder, filename)
if os.path.isfile(attachment_path):
# Add the file to the zip archive
zip_file.write(attachment_path, filename)
# Attach the zip file to the message
with open(zip_filename, 'rb') as attachment:
part = MIMEBase('application', 'zip')
part.set_payload(attachment.read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', f'attachment; filename= {zip_filename}')
message.attach(part)
# Connect to the SMTP server
server = smtplib.SMTP(smtp_server, smtp_port)
# server.starttls()
server.login(sender, password)
# Send the email
server.send_message(message)
# Disconnect from the server
server.quit()
# Delete the zip file
os.remove(zip_filename)
# usage
sender = ''user_activity@mytemp.com”
password = “password”
recipients = ['mark@mark.com', 'abc@cde.com']
subject = 'user activity log'
body = 'Please find the attachments in this email.'
attachment_folder = '/var/log/session'
smtp_server = 'smtp.mytemp.com'
smtp_port = 25
send_email(sender, password, recipients, subject, body, attachment_folder, smtp_server, smtp_port)
需要说明的是,enterprise 的邮箱有可能会过滤掉 zip 文件,不过经过几次测试一般都是进入垃圾邮箱的。
重放(可选)
拿到日志的审计人员,可以在自己的环境进行重放,当然直接读 log 也够了。
重放的指令如下:
scriptreplay session.root.xxx.timing session.root.xxx.log
注意事项
这种审计模式由于包含所有的输入输出,而且在/etc/profile 下会对所有的终端用户启用,所以需要特别注意,是否只应对个别用户启用,而且记录的 log 由于可能包含有个人的数据信息,所以也需要审计人员特别的注意。还有就是如果用户的输入输出操作比较频繁,生成的 log 可能会非常大,要定期对旧文件进行备份和删除的操作,避免存储空间的大量占用。