banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận bảo mật [Thủ thuật] Cẩn thận với sudo trên *nix.  XML
  [Article]   [Thủ thuật] Cẩn thận với sudo trên *nix. 07/12/2007 00:11:10 (+0700) | #1 | 102317
[Avatar]
conmale
Administrator

Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
[Profile] [PM]
Sudo, một phương tiện cần thiết để giới hạn người dùng bình thường có quyền thực thi các công tác đòi hỏi chủ quyền root. Trích từ man sudo:

sudo allows a permitted user to execute a command as the superuser or another user, as speci-
fied in the sudoers file. The real and effective uid and gid are set to match those of the
target user as specified in the passwd file and the group vector is initialized based on the
group file (unless the -P option was specified). If the invoking user is root or if the tar-
get user is the same as the invoking user, no password is required. Otherwise, sudo requires
that users authenticate themselves with a password by default (NOTE: in the default configu-
ration this is the user's password, not the root password). Once a user has been authenti-
cated, a timestamp is updated and the user may then use sudo without a password for a short
period of time (5 minutes unless overridden in sudoers). 


Tạm dịch:
sudo cho phép người dùng thực thi một lệnh nào đó với quyền superuser hoặc quyền của một người khác như đã ấn định trong hồ sơ sudosers. Giá trị thật sự và xác thực uid (user id) và gid (group id) được gán với mục tiêu user như đã ấn định trong hồ sơ passwd và thành phần nhóm được ứng động dựa trên hồ sơ group (ngoại trừ chọn lựa -P được dùng). Nếu người thực thi (sudo) là root hoặc nếu chủ quyền thực thi của mục tiêu cũng là người thực thi thì sẽ không đòi hỏi mật khẩu. Ngoài ra, sudo đòi hỏi người dùng xác thực danh tánh của họ bằng mật khẩu theo mặc định (LƯU Ý: trong cấu hình mặc định, đây là mật khẩu của người dùng chớ không phải là mật khẩu của root). Sau khi người dùng đã được xác thực, giá trị dấu ấn thời gian được cập nhật và người dùng có thể sử dụng sudo mà không cần phải cung cấp mật khẩu trong một khoảng thời gian ngắn (5 phút theo mặc định ngoại trừ đã được chỉnh sửa trong sudoers).


Tại sao phải cẩn thận? sudo chỉ giới hạn người dùng được quyền chạy một số lệnh nhất định nào đó, thường là để thực thi các lệnh đòi hỏi chủ quyền root. Ví dụ muốn khởi động apache thì phải chạy bằng root vì để thiết lập cổng 80 (thuộc dãy "privilege ports" cần phải là root). Thông thường một script start apache có nhiều thứ trong đó nhưng cốt lõi là:

Code:
#!/bin/sh
......
/usr/local/apache2/bin/apachectl -f /usr/local/apache2/conf/httpd.conf -k start


Nếu như script này cho phép người dùng chỉnh sửa (do gán quyền sai, hoặc do script này được người dùng bình thường tạo ra và làm chủ và admin chỉ đưa nó vào danh sách được quyền thực thi bằng sudo mà không xét cẩn thận) thì hậu quả rất nguy hại. Nếu người dùng chỉ cần thay đổi 1 điểm nhỏ trong cái script như sau:

Code:
#!/bin/sh
su -
......
/usr/local/apache2/bin/apachectl -f /usr/local/apache2/conf/httpd.conf -k start

thì thay vì chỉ thực thi công tác khởi động apache, user đã có hoàn toàn chủ quyền root trên shell.

Demo:

Giả sử tôi có 1 cái script đơn giản và ngốc nghếch như sau:

$ cat test.sh
Code:
#!/bin/bash
echo "me @ `hostname`"


Khi chạy nó bằng sudo:

$ sudo ./test.sh, tôi có kết quả:
me @ home

Thử xem tôi có chủ quyền gì:
$ whoami

conmale

Thử xem một lần nữa bằng cách khác cho chắc ăn:
$ id

uid=500(conmale) gid=500(conmale) groups=500(conmale) context=system_u:system_r:initrc_t


Giả sử tôi có thể điều chỉnh file test.sh ở trên và chèn dòng su - vào:
$ cat test.sh
Code:
#!/bin/bash
echo "me @ `hostname`"
su -


Sau đó tôi thực thi:
[conmale@home ~]$ sudo ./test.sh
me @ home
[root@home ~]#

thêm 1 dòng màu đỏ ở trên trên console sau khi thực thi lệnh trên. Từ dấu nhắp $ biến thành #, trông có vẻ bất thường. Tôi thử:

[root@home ~]# whoami
root

Thử thêm một lần nữa cho chắc:
[root@home ~]# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=root:system_r:unconfined_t

Tôi không bàn cụ thể việc thiết lập và điều chỉnh sudoers thế nào ở đây mà chỉ muốn nhắc:

1) khi đưa một account hoặc nhóm account vào sudoers, phải xét thật kỹ các account đó là gì và lý do tại sao chúng được phép sudo.
2) ấn định cụ thể từng lệnh được quyền chạy sudo và điều tra kỹ lưỡng nội dung của chúng.
3) scripts và binaries được chạy xuyên qua sudo luôn luôn chỉ ở chế độ executable và không được ấn định quyền write.

Bài này tôi viết một cách ngắn gọn như một dạng thủ thuật vì vừa "thừa hưởng" một đống máy chủ, thiết bị... từ một bộ phận khác và trên 80% bị rơi vào lỗi chết người này.

Have fun.
What bringing us together is stronger than what pulling us apart.
[Up] [Print Copy]
  [Question]   [Thủ thuật] Cẩn thận với sudo trên *nix. 07/12/2007 00:57:00 (+0700) | #2 | 102334
[Avatar]
quanta
Moderator

Joined: 28/07/2006 14:44:21
Messages: 7265
Location: $ locate `whoami`
Offline
[Profile] [PM]
Cảm ơn anh về bài viết

conmale wrote:

...
Giả sử tôi có thể điều chỉnh file test.sh ở trên và chèn dòng su - vào:
$ cat test.sh
Code:
#!/bin/bash
echo "me @ `hostname`"
su -


Sau đó tôi thực thi:
[conmale@home ~]$ sudo ./test.sh
me @ home
[root@home ~]#

thêm 1 dòng màu đỏ ở trên trên console sau khi thực thi lệnh trên. Từ dấu nhắp $ biến thành #, trông có vẻ bất thường.
 

Còn "có vẻ" gì nữa anh. Nhìn cái [root@home ~]# ở trên biết là bị "dính cước" rồi.
Em hỏi thêm là: có phải tất cả các distro đều quy ước dấu nhắc $ cho normal user# cho root không anh? Em chỉ có dịp kiểm chứng trên Fedora, Ubuntu, CentOS

conmale wrote:

...
Tôi không bàn cụ thể việc thiết lập và điều chỉnh sudoers thế nào ở đây mà chỉ muốn nhắc:

1) khi đưa một account hoặc nhóm account vào sudoers, phải xét thật kỹ các account đó là gì và lý do tại sao chúng được phép sudo.
2) ấn định cụ thể từng lệnh được quyền chạy sudo và điều tra kỹ lưỡng nội dung của chúng.
3) scripts và binaries được chạy xuyên qua sudo luôn luôn chỉ ở chế độ executable và không được ấn định quyền write.
...
Have fun. 

Có lẽ điểm thứ 2 chính là điểm khó thực hiện và cần xem xét kỹ nhất. Phần lớn mọi người khi thêm 1 user vào /etc/sudoers đều thường làm giống như:
quanta ALL=(ALL) ALL 

Đây chính là ví dụ minh họa cho 2 mặt của vấn đề "tiện dụng" và "bảo mật" trong "Đối thoại với Rookie" của anh smilie
Let's build on a great foundation!
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|