Làm cách nào tôi có thể theo dõi các tệp thực thi được tạo bởi người dùng của tôi trên Linux?


11

Sử dụng Linux, tôi muốn theo dõi các tệp thực thi được thực thi trong tên của mình, bao gồm toàn bộ dòng lệnh (trong thực tế, mọi exec * () được thực hiện như người dùng của riêng tôi). Một chương trình tôi không kiểm soát được cho là, để xử lý một tác vụ, để thực thi chương trình tôi truyền vào, nhưng tôi muốn chắc chắn rằng nó làm như vậy, và nó sử dụng tùy chọn nào. Chương trình tôi không điều khiển là lén lút và dường như thay đổi hành vi tùy thuộc vào tên của chương trình mà nó được cho là thực thi cho nhiệm vụ, vì vậy tôi không thể chuyển qua tập lệnh shell để ghi thông tin và gọi thực. chương trình.

Tôi có thể được thông báo về tất cả các thực thi * () được thực hiện với tư cách là người dùng của tôi trên hệ thống trên Linux, bao gồm cả dòng lệnh đầy đủ không? Ngắn chạy pstrong một vòng lặp, đó là. Tôi muốn làm điều đó trực tiếp trên hệ thống mà tôi làm việc và không yêu cầu quyền truy cập root, nhưng nếu cần tôi có thể tạo ra một hệ thống mà tôi có quyền truy cập root, cài đặt các chương trình và điều tra ở đó.

Sử dụng Ubuntu 12.4 LTS.


Tôi đang hỏi ở đây chứ không phải hỏi Ubuntu, vì đây là câu hỏi của Unix / Linux hơn là câu hỏi Ubuntu thực sự.
Pierre Lebeaupin

1
Làm thế nào lén lút là chương trình? Nó có cố gắng phát hiện hoặc bỏ qua các trình sửa lỗi không? Là nó liên kết động? Nếu nó quá lén lút, bạn có thể cần phải sử dụng một máy ảo nơi bạn đã root. (Đây có thể là chiến lược đơn giản nhất ngay cả đối với một chương trình không đặc biệt lén lút.)
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles Đó thực sự là một khả năng, tôi sẽ thử VM, sau đó cập nhật câu hỏi nếu điều đó trở nên khả thi.
Pierre Lebeaupin

Lưu ý: bạn dường như thực sự muốn tên chương trình và đối số mà câu trả lời auditđưa ra, nhưng 'toàn bộ dòng lệnh' trong vỏ cũng có thể ảnh hưởng đến quá trình con bằng cách sử dụng cài đặt chuyển hướng / đường ống và envvar cũng như chứa thay thế / mở rộng, trích dẫn không đáng kể và khoảng cách, và các cấu trúc điều khiển như doa && dob, và bạn sẽ không có được chúng.
dave_thndry_085

Câu trả lời:


10

Bạn cần cấu hình auditdđể ghi lại execvecác sự kiện. Ví dụ về RHEL5:

[root@ditirlns01 ~]# auditctl -a always,entry -S execve
WARNING - 32/64 bit syscall mismatch, you should specify an arch
[root@ditirlns01 ~]#

Tôi bỏ qua cảnh báo vòm và nó dường như không quan trọng nhưng bạn có thể sử dụng -F arch=b64hoặc -F arch=b32đặt nó nếu bạn muốn.

Kết quả của những điều trên là:

[root@ditirlns01 ~]# ls /tmp/whatever
ls: /tmp/whatever: No such file or directory
[root@ditirlns01 ~]# grep whatever /var/log/audit/audit.log
type=EXECVE msg=audit(1386797915.232:5527206): argc=3 a0="ls" a1="--color=tty" a2="/tmp/whatever"
type=EXECVE msg=audit(1386797927.133:5527241): argc=3 a0="grep" a1="whatever" a2="/var/log/audit/audit.log"
[root@ditirlns01 ~]#

Điều đó rõ ràng nhanh chóng và bẩn thỉu nhưng đó là những điều cơ bản về cách bạn làm điều đó. Những gì bạn cần làm chính xác có lẽ phụ thuộc rất nhiều vào những gì bạn đang cố gắng làm chính xác. Bạn có thể giảm lưu lượng kiểm toán bằng nhiều bộ lọc khác nhau trong auditctllệnh nhưng tôi không biết bất kỳ thông tin nào trong số đó vì vậy tôi không biết nên bao gồm những gì. Nếu bạn cần một cái gì đó cụ thể hơn, tôi khuyên bạn nên kiểm tra trang nam hoặc đăng bình luận cho câu trả lời này và tôi sẽ cập nhật thêm.

Hy vọng rằng sẽ giúp đẩy bạn đi đúng hướng.

BIÊN TẬP:

Vì câu hỏi của bạn liên quan đến việc xem xét một người dùng cụ thể, tôi có thể cho bạn thấy rằng:

[root@ditirlns01 ~]# auditctl -a always,entry -S execve -F euid=16777216
WARNING - 32/64 bit syscall mismatch, you should specify an arch

Giống hệt như trên, nhưng chỉ execvebởi ai đó đang chạy với ID người dùng hiệu quả 16777216mới được đăng nhập. Nếu bạn cần chỉ định loginuidgiá trị của người dùng (người đầu tiên họ đăng nhập vào hệ thống) thì bạn sẽ lọc bằng cách auidthay thế:

[root@ditirlns01 ~]# auditctl -a always,entry -S execve -F auid=16777216
WARNING - 32/64 bit syscall mismatch, you should specify an arch

Các bộ lọc AUID / loginuid sẽ hữu ích, ví dụ nếu người dùng sẽ thực hiện suhoặc sudoroot. Trong tình huống đó, sẽ có rất nhiều công cụ chạy bằng root, nhưng bạn chỉ quan tâm đến những thứ bị người dùng khởi động trong câu hỏi. auditctlcũng cho phép bạn xếp các bộ lọc để bạn có thể lọc theo cả hai euidauid:

[root@ditirlns01 ~]# auditctl -a always,entry -S execve -F auid=16777216 -F euid=0
WARNING - 32/64 bit syscall mismatch, you should specify an arch
[root@ditirlns01 ~]# ls /tmp/nashly -ltar
ls: /tmp/nashly: No such file or directory
[root@ditirlns01 ~]# grep nashly /var/log/audit/audit.log
type=EXECVE msg=audit(1386798635.199:5529285): argc=4 a0="ls" a1="--color=tty" a2="/tmp/nashly" a3="-ltar"
type=EXECVE msg=audit(1386798646.048:5529286): argc=3 a0="grep" a1="nashly" a2="/var/log/audit/audit.log"

1
Lưu ý rằng tôi không có quyền truy cập root. (Nếu không thì đây sẽ là một câu trả lời hay.)
Gilles 'SO- ngừng trở nên xấu xa'

Chết tiệt ... thật gần ...
Bratchley

Cảm ơn, điều đó đã làm việc. Tôi nên nói thêm rằng tôi phải cài đặt audctl bằng apt-get, nó không được cài đặt sẵn trên Ubuntu.
Pierre Lebeaupin

Cảm ơn. Ví dụ tốt đẹp. Nhưng có cách nào để lấy mã thoát ra khỏi nhật ký kiểm toán không?
Kaos

0

Bạn đã hỏi một cái gì đó đơn giản. Tôi đã làm một ví dụ với mplayernhưng tôi đoán nó có thể thích nghi với các tình huống khác:

#! /bin/sh
# This executable must be used instead of /usr/bin/mplayer
# do not forget the chmod +x filename...
LOG=/tmp/mplayer.log
echo "$@" >> $LOG
if [ -n "$1" ] && [ -f "$1" ] ; then
        filename="$1"
        echo "$(date "+%F %T") $(basename "$filename")" \
        | tee -a "$(dirname "$filename")/mplayer.log"  >> $LOG
fi
/usr/bin/mplayer "$@"

Như bạn có thể thấy điều này rất đơn giản: Nó phân tích đối số đầu tiên, vì nó là một tệp, một nhật ký được tạo thành tệp trung tâm $LOGvà được nối vào một tệp (luôn có cùng tên mplayer.logtrong cùng một thư mục.

Vì vậy, người dùng có thể nhận được bộ phim mới nhất mà anh ta đã đọc trên mỗi thư mục.


Q đặc biệt nói rằng việc thay thế một kịch bản sẽ không hiệu quả.
dave_thndry_085

Có thể, nhưng điều này phù hợp với tình huống của tôi: Tôi không có vấn đề gì về bảo mật và tôi có thể chọn tập lệnh tôi chạy. Thật khó tin, dường như tôi có giải pháp đơn giản đơn giản nhất này, có thể người khác sẽ quan tâm không đi sâu vào những thứ chỉ có đam mê. Tôi thừa nhận giải pháp trước đó là an toàn hơn!
MUY Bỉ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.