Làm thế nào để đăng nhập các lệnh trong một sudo su - su?


12

Nếu tôi:

[user@notebook ~] sudo echo 123456uu
123456uu
[user@notebook ~] 

Sau đó, tôi có thể thấy rằng trong các bản ghi:

[root@notebook /var/log] grep 123456uu *
auth.log:Jan  9 17:01:51 notebook sudo: user : TTY=pts/3 ; PWD=/home/user ; USER=root ; COMMAND=/bin/echo 123456uu
[root@notebook /var/log] 

nhưng nếu tôi:

[user@notebook ~] sudo su -
[root@notebook ~] echo 1234567zz
1234567zz
[root@notebook ~] 

Tôi không thể nhìn thấy nó trong nhật ký:

[root@notebook /var/log] grep 1234567zz *
[root@notebook /var/log] echo $?
1
[root@notebook /var/log] 

Câu hỏi của tôi: Làm cách nào tôi có thể bật đăng nhập cho các lệnh trong "sudo su -"?

HĐH là Ubuntu 12.04 nhưng câu hỏi nói chung là.

CẬP NHẬT # 1:

[user@notebook ~] sudo su -
[sudo] password for user: 
[root@notebook ~] echo zizizi
zizizi
[root@notebook ~] cd /var/log
[root@notebook /var/log] grep -iIR 'zizizi' *
[root@notebook /var/log] grep 'COMMAND=/bin/su -' *
auth.log:Jan 10 15:42:42 notebook sudo: user : TTY=pts/1 ; PWD=/home/user ; USER=root ; COMMAND=/bin/su -
[root@notebook /var/log]

Nếu ai đó độc hại (hoặc thậm chí không đáng tin) có quyền truy cập sudo su -, họ cũng có khả năng xóa tất cả các mục nhật ký bạn có thể thực hiện cho hành động của họ. Nếu bạn muốn chắc chắn 100% trong việc đăng nhập của mình, bạn cần hạn chế sudorất nhiều và không cho phép sudo suhoàn toàn.
tự đại diện

Câu trả lời:


16

Vì bạn đang sử dụng Ubuntu 12.04, hãy xem khả năng ghi nhật ký I / O được kích hoạt thông qua các tùy chọn log_inputlog_output.

log_input

    Nếu được đặt, sudosẽ chạy lệnh trong giả giả và ghi nhật ký tất cả đầu vào của người dùng. Nếu đầu vào tiêu chuẩn không được kết nối với tty của người dùng, do chuyển hướng I / O hoặc do lệnh là một phần của đường ống, đầu vào đó cũng được ghi lại và lưu trữ trong một tệp nhật ký riêng.

    Đầu vào được ghi vào thư mục được chỉ định bởi iolog_dirtùy chọn ( /var/log/sudo-iotheo mặc định) bằng ID phiên duy nhất được bao gồm trong dòng nhật ký sudo bình thường, có tiền tố TSID=. Các iolog_filetùy chọn có thể được sử dụng để kiểm soát các định dạng của các ID phiên.

    Lưu ý rằng đầu vào của người dùng có thể chứa thông tin nhạy cảm như mật khẩu (ngay cả khi chúng không được lặp lại trên màn hình), sẽ được lưu trữ trong tệp nhật ký không được mã hóa. Trong hầu hết các trường hợp, ghi nhật ký đầu ra lệnh thông qua logDefput là tất cả những gì được yêu cầu.

log_output

    Nếu được đặt, sudosẽ chạy lệnh trong giả giả và ghi nhật ký tất cả đầu ra được gửi đến màn hình, tương tự như lệnh script (1). Nếu đầu ra tiêu chuẩn hoặc lỗi tiêu chuẩn không được kết nối với tty của người dùng, do chuyển hướng I / O hoặc do lệnh là một phần của đường ống, đầu ra đó cũng được ghi lại và lưu trữ trong các tệp nhật ký riêng biệt.

    Đầu ra được ghi vào thư mục được chỉ định bởi iolog_dirtùy chọn ( /var/log/sudo-iotheo mặc định) bằng ID phiên duy nhất được bao gồm trong dòng nhật ký sudo bình thường, có tiền tố TSID=. Các iolog_filetùy chọn có thể được sử dụng để kiểm soát các định dạng của các ID phiên.

    Nhật ký đầu ra có thể được xem với tiện ích sudoreplay (8), cũng có thể được sử dụng để liệt kê hoặc tìm kiếm các nhật ký có sẵn.

THỰC HIỆN: Phiên bản Sudo ít nhất: 1.7.4p4 cần thiết.

/etc/sudoerssửa đổi: Tất cả những gì bạn cần làm là thêm hai thẻ vào tất cả các mục nhập sudoers cần thiết (trong đó "su" được chỉ định, bằng lệnh hoặc bí danh). LOG_INPUT và LOG_OUTPUT.

Thí dụ:

%admins         ALL=(ALL) NOPASSWD: LOG_INPUT: LOG_OUTPUT: ALL

Thêm cấu trúc thư mục nhật ký mặc định sau vào sudoers:

Defaults iolog_dir=/var/log/sudo-io/%{user}

thật tuyệt, nhưng không hoạt động trên các hệ thống cũ ..: \
newuser999

Có thể tạo một gói phiên bản sudo hiện tại hoặc nâng cấp hệ thống?
dị

13

grepKhi bạn thực hiện sudo su -không thành công vì bạn không chạy echo 1234567zz, bạn đang chạy su -, sẽ khởi chạy một trình bao. Shell sau đó đang chạy của bạn echo.

Điều này là có chủ ý và việc ghi nhật ký mỗi lần chạy lệnh sẽ tràn ngập nhật ký hệ thống của bạn với thông tin vô dụng (thường có hàng tấn chương trình chạy phía sau hậu trường mà bạn không thường thấy).

Nếu bạn thay đổi grep của bạn để grep 'COMMAND=/bin/su -' *bạn sẽ thấy nó.


sudo su -cũng là một cách sử dụng vô dụng su. sudo -ilàm điều tương tự


nhưng làm thế nào tôi có thể đăng nhập "sudo su -"?
newuser999

1
Nó được ghi lại. Bạn đã thử grep 'COMMAND=/bin/su -' *(hoặc không có ký tự đại diện grep 'COMMAND=/bin/su -' /var/log/auth.log:)?
Patrick

Tôi cập nhật câu hỏi. tôi phải làm gì khác để chứng minh rằng khi sử dụng "sudo su -" các lệnh không được ghi lại ??
newuser999

4
Lệnh ( sudo -) được ghi lại và đầu ra cập nhật của bạn hiển thị điều này. Đó là tất cả những gì chúng ta đang nói ở đây. Các lệnh khác, chẳng hạn như echosau khi bạn chuyển đổi người dùng sudo -, không phải là lệnh sudo và do đó (theo câu trả lời của tôi) không được đăng nhập auth.log. Chỉ các lệnh riêng lẻ được mở đầu rõ ràng với sudosẽ được ghi lại. Vì vậy, đã sudo echođược ghi lại, nhưng chỉ đơn giản echolà không, bất kể thực tế là bạn đã chuyển sang siêu người dùng.
goldilocks

12

Để tăng độ phức tạp, đây là ba cách ghi nhật ký các lệnh được ban hành trong "sudo su -":

  1. Dựa vào lịch sử lệnh bash
  2. Cài đặt một trình bao bọc đăng nhập thực thi
  3. Sử dụng kiểm toán của SELinux

Như thế nào là phù hợp, nó thực sự phụ thuộc vào những gì bạn đang cố gắng thực hiện với việc đăng nhập.

1) Lịch sử chỉ huy Bash

Bạn sẽ muốn định cấu hình tính lịch sử để đảm bảo giữ đủ các dòng, không ghi đè từ các phiên khác nhau, không bỏ qua các lệnh và dấu thời gian thích hợp. (Xem các biến HIST * trong hướng dẫn bash ). Dễ dàng lật đổ bằng cách chỉnh sửa tệp lịch sử, thao tác môi trường hoặc chạy shell khác.

2) thực thi gói

snoopylogger là một. Thêm một kiểm tra /etc/profilerằng thư viện logger nằm trong sơ đồ bộ nhớ của tiến trình ( /proc/<pid>/maps) và nếu không, hãy đặt LD_PRELOADvà khởi động lại (với exec $SHELL --login "$@"). Thay phiên, bạn có thể thêm một mục vào /etc/ld.so.preload với $LIB/snoopy.sohoặc các đường dẫn tương đương vào các phiên bản snoopy.so 32/64-bit của bạn.

Mặc dù khó khăn hơn, LD_PRELOADphiên bản biến môi trường ở trên vẫn có thể bị phá vỡ bằng cách thao túng môi trường thực thi để mã snoopy không còn chạy.

Syslog nên được gửi ngoài hộp để nội dung được tin cậy.

3) kiểm toán

Cấu hình hơi đơn giản hơn so với trình bao bọc thực thi, nhưng khó hơn để trích xuất thông tin từ đó. Đây là câu trả lời cho câu hỏi mà bạn thực sự có thể hỏi: "Có cách nào để ghi lại hiệu ứng mà người dùng đã có trên hệ thống sau khi họ phát hành không sudo su -". Syslog nên được gửi ngoài hộp để nội dung được tin cậy.

Câu trả lời Serverfault này dường như là một cấu hình khá toàn diện để sử dụng với audd.

Có một số gợi ý khác cho một câu hỏi tương tự trên serverfault .


9

Tại sao?

Bởi vì đó sudolà việc ghi nhật ký; nó đăng nhập sudo commmands. Trong trường hợp đầu tiên, sudo echođược ghi lại. Trong trường hợp thứ hai, sudo suđược ghi lại (tìm nó trong /var/log/auth.log).

sulà "chuyển người dùng", theo mặc định là root. Bất cứ điều gì bạn làm sau đó không đi qua sudo. Nó giống như khi bạn đăng nhập bằng root; đăng nhập chính nó được ghi lại, nhưng không phải mỗi và mọi lệnh.


5

Như những người khác đã nói, sudokhông thể làm điều này.

Thay vào đó, sử dụng auditd. Nếu bạn muốn ghi nhật ký mọi thứ được thực hiện bởi root (bao gồm cả những thứ được thực hiện bởi crontab), hãy sử dụng điều này:

sudo auditctl -a exit,always -F euid=0

ETA: Lưu ý rằng việc ghi nhật ký mọi thứ sẽ ảnh hưởng đến hiệu suất, vì vậy bạn có thể muốn giới hạn một chút. Xem man auditctlví dụ.

Nếu bạn chỉ muốn đăng nhập các tòa nhà cao tầng nơi uid đăng nhập ban đầu không phải là root, thay vào đó hãy sử dụng cái này:

sudo auditctl -a exit,always -F euid=0 -F auid!=0

Các nhật ký thường sẽ kết thúc bằng /var/log/audit/audit.log. Bạn có thể tìm kiếm chúng với ausearch.

Có nhiều thông tin trong các trang người đàn ông cho auditctl, audit.rulesausearch.


2
Ồ, để nhật ký kiểm toán được tin cậy, chúng phải được gửi đến một máy chủ riêng. Bất kỳ nhật ký nào cư trú trên máy mà người dùng không tin cậy đã root đều không thể tin cậy được.
Jenny D

ngay cả sau đó bạn không thể tin tưởng những gì không hoặc không đến từ một máy chủ bị xâm nhập.
Matt

Nhưng bạn sẽ có một dấu vết cho đến khi nó bị xâm phạm.
Jenny D

2
Trong trường hợp của op là về mặt kỹ thuật ngay khi chúng chạy, sudo su -vì vậy bạn quay lại quảng trường một
Matt

Không đáng tin cậy không giống như thỏa hiệp. Nó không bị xâm phạm cho đến khi họ thực sự làm điều gì đó bất chính, trong đó, nhật ký kiểm toán trên máy chủ từ xa sẽ cho bạn thấy những gì đã được thực hiện và bởi ai - bao gồm cả ai đã bị kiểm toán bị vô hiệu hóa. Và thậm chí ngoài điều đó, một bản ghi từ xa sẽ giúp ích khi ai đó xóa nhật ký cục bộ do nhầm lẫn hoặc để bảo vệ bản thân khỏi đổ lỗi cho một lỗi.
Jenny D

2

sudo su -sẽ ở trong ~/.bash_historynếu vỏ của bạn là bash.

echo 1234567zzsẽ ở trong /root/.bash_historynếu vỏ của root bị bash.

Giải thích về điều này đã được đăng bởi goldilocks.


2

Bạn có muốn su đăng nhập vì bạn cảm thấy đó là một lỗ hổng bảo mật? Bạn đã nghĩ về lệnh này? sudo bashchỉ là imho xấu.

Nếu bạn lo lắng về những gì mọi người có thể làm với sudo, thì bạn sẽ cần phải hạn chế sử dụng nó. Bạn có thể hạn chế các lệnh họ có thể thực thi quá. Hạn chế quyền truy cập vào / bin / su nếu nó làm bạn lo lắng.


1

Cái này thì sao:

export HISTTIMEFORMAT="%d/%m/%y %T "
export PROMPT_COMMAND='builtin history 1 >> /var/log/sudo.log'
sudo -E su
unset PROMPT_COMMAND

hoặc là

export HISTTIMEFORMAT="%d/%m/%y %T "
export PROMPT_COMMAND='builtin history 1 >> /var/log/sudo.log' 
sudo -E su --preserve-environment -
unset PROMPT_COMMAND

hoặc một lớp lót dài:

HISTTIMEFORMAT="%d/%m/%y %T " PROMPT_COMMAND='builtin history 1 >> /var/log/sudo.log' sudo -E su

sudo -E bảo vệ môi trường PROMPT_COMMAND được thực thi trước mỗi dấu nhắc


cái đầu tiên không cung cấp cho tôi bàn điều khiển VÀ nếu tôi đặt cái thứ hai vào /root/.bashrc thì tôi phải nhấn CTRL + C nếu tôi muốn lấy giao diện điều khiển gốc sau "sudo su -": D bất kỳ cơ hội nào để sửa lỗi này (hoặc thêm chức năng "ngày" vào nó?). Cảm ơn nhiều!
newuser999

Tôi sợ bạn lạm dụng nó. Chỉnh sửa nó để làm cho rõ ràng hơn.
Costa

1

Nếu điều này có ích, bạn có thể sử dụng tùy chọn "NOEXEC" của sudoers.

Bạn cần định nghĩa nó là

USER_NAME         ALL=(ALL) NOEXEC : ALL

Điều này sẽ ngăn thoát vỏ và người dùng sẽ không thể sử dụng sudo -i hoặc sudo -s hoặc sudo su -

Điều này đi kèm với một nhược điểm, tuy nhiên, mọi lối thoát vỏ sẽ bị vô hiệu hóa. đối với việc thực thi tập lệnh từ bên trong tập lệnh cũng sẽ bị từ chối.


0

Chúng ta đừng làm cho điều này trở nên phức tạp: Bất cứ khi nào sudođược gọi, nó sẽ báo cáo thực tế này trong một số tệp trong /var/log(trên hệ thống của bạn auth.log, trên hộp OS X của tôi system.log). sudobáo cáo các đối số dòng lệnh của nó, nhưng nó không có kiến ​​thức về những gì có thể xảy ra bên trong một lệnh tương tác như thế nào su.

Điều này không có nghĩa là không có hồ sơ về những gì xảy ra trong một lớp con gốc: Các lệnh Shell được lưu trong lịch sử của shell. Trên hệ thống của tôi, lưu lịch sử của root được bật theo mặc định, vì vậy tất cả những gì tôi phải làm là tìm kiếm ~root/.sh_historymột bản ghi về những gì đã được thực hiện (tất nhiên trừ khi ai đó can thiệp vào nó, tất nhiên, nhưng chúng cũng có thể can thiệp tốt /var/log).

Tôi nghĩ rằng đây là giải pháp tốt nhất cho bạn. Nếu không, hãy đến thị trấn với auditd, như @Jenny đề xuất.

Tái bút Nếu lịch sử của root chưa được kích hoạt, việc bật nó phụ thuộc vào việc sử dụng shell nào. Đối với bash, đặt HISTORYHISTFILESIZEđến một số đủ lớn (mặc định là 500, hướng dẫn của tôi nói). Nếu bạn muốn bạn có thể chỉ định nơi lịch sử được lưu bằng cách đặt HISTFILEthành một đường dẫn (mặc định $HOME/.sh_history)


0

Bạn có thể muốn tạo một bản thảo của phiên bằng cách sử dụng script(1) :

$ sudo su -
# script -t /tmp/my_typescript 2> /tmp/my_typescript.timing
Script started, file is /tmp/my_typescript
# echo foobar
foobar
# echo hello world
hello world
# exit
exit
Script done, file is /tmp/my_typescript

Bây giờ bạn có thể grep(lưu ý rằng# lời nhắc thực sự được ghi lại /tmp/my_typescript):

$ grep echo /tmp/my_typescript
# echo foobar
# echo hello world

Ngoài ra, bạn thậm chí có thể xem lại toàn bộ phiên với scriptreplay(1) :

$ scriptreplay -t /tmp/my_typescript.timing /tmp/my_typescript

Tệp /tmp/my_typescript.timingchứa thông tin khi mỗi lệnh đã được gọi. Có nhiều công cụ như ttyrechoặc shelrthậm chí có nhiều chuông và còi hơn.

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.