Có cách nào để ngăn chặn tất cả các lệnh được định nghĩa là bí danh không?
Ví dụ: người dùng không thể xác định rm
hoặc bất kỳ lệnh nào khác (các lệnh mặc định của Ubuntu) làm tên bí danh.
~/.bashrc
.
Có cách nào để ngăn chặn tất cả các lệnh được định nghĩa là bí danh không?
Ví dụ: người dùng không thể xác định rm
hoặc bất kỳ lệnh nào khác (các lệnh mặc định của Ubuntu) làm tên bí danh.
~/.bashrc
.
Câu trả lời:
Không có cách nào bạn có thể ngăn người dùng xác định bất kỳ bí danh nào họ thích. Xem xét:
/etc/bash.bashrc
. Họ cho phép nó bất cứ nơi nào họ chọn./etc/bash.bashrc
, và tất cả ~/.bashrc
và ~/.bash_aliases
thông qua một tập lệnh. Họ đặt bí danh của họ trong một tập tin khác và nguồn nó.PROMPT_COMMAND
đó vô hiệu hóa các bí danh nhất định. Họ xác định lại hoặc xác định PROMPT_COMMAND
.DEBUG
và xác định bí danh. Họ gỡ bẫy.unset
, builtin
và enable
; làm alias
một chức năng ; declare -rf alias
để ngăn người dùng sửa đổi chức năng; và xuất hàm. Họ chạy /bin/bash
cùng --rcfile
và --init-file
để bắt đầu một lớp vỏ mới, trong đó các nội dung cho biết hiện đã được bật.Bạn có thể vô hiệu hóa các bí danh tại thời điểm biên dịch, sau đó sẽ tùy thuộc vào bạn để cập nhật bash và đảm bảo bạn không bị ảnh hưởng bởi Shellshock tiếp theo. Tất nhiên, người dùng có thể xây dựng bash của riêng họ.
unalias alias
.
\unalias unalias
.
Cách duy nhất để ngăn người dùng tạo bí danh là cung cấp cho họ một trình bao không hỗ trợ bí danh. Đây thường là một vấn đề X / Y, trong đó X thực sự là một mô hình mối đe dọa cần được giải quyết bằng các điều khiển hoặc kiến trúc phù hợp thay vì cố gắng giải quyết vấn đề hậu thực tế sau khi người dùng được đưa vào hệ thống chia sẻ.
Dưới đây, tôi cung cấp một câu trả lời đúng về mặt kỹ thuật, cũng như một số hướng dẫn về những vấn đề này sẽ không giải quyết được. Tôi cũng cung cấp một số hướng dẫn bổ sung về các điều khiển thay thế.
Bạn có thể sử dụng shell bị hạn chế của Bash bằng cách gán rbash làm shell đăng nhập của người dùng. Ví dụ:
foo:x:2001:2001:restricted user:/home/foo:/bin/rbash
Sau đó, bạn phải vô hiệu hóa bí danh tích hợp cho người dùng, tốt nhất là không phá vỡ vỏ của người khác. Ví dụ: bạn có thể thêm phần sau vào tệp như /etc/profile.d/rbash.sh :
# Limit effect to users in a specific UID range.
if ((UID >= 2000)) && ((UID < 3000)); then
# Check shell options; disable alias builtins when shell is restricted.
if [[ $- =~ r ]]; then
enable -n alias
enable -n unalias
fi
fi
Trừ khi bạn đặt người dùng vào nhà tù chroot hoặc cung cấp cho họ một PATH đã sửa đổi không bao gồm quyền truy cập vào các shell khác, không có gì ngăn người dùng chỉ cần gõ bash
vào dấu nhắc và nhận được một vỏ không bị hạn chế.
Ngoài ra, bằng cách thiết kế shell bị hạn chế ngăn chặn nhiều hoạt động phổ biến như thay đổi thư mục:
$ cd /tmp
rbash: cd: restricted
nhưng không ngăn các tập lệnh hoặc chương trình khác trong PATH làm như vậy. Điều này có nghĩa là bạn phải cẩn thận tạo môi trường cho người dùng và đặc biệt là bạn cần ngăn họ không thể sửa đổi PATH trong các tệp khởi động của họ, bởi vì mặc dù rbash làm cho PATH chỉ đọc được sau khi khởi tạo.
Ngay cả khi bạn sử dụng rbash, bạn cần phải làm như vậy như là một phần của bộ điều khiển rộng hơn. Một số ví dụ có thể bao gồm:
Ngăn chặn người dùng không có kỹ thuật từ vô tình gọi lệnh nguy hiểm bằng cách cung cấp các bí danh mặc định như rm -i
, mv -i
và cp -i
trong /etc/bash.bashrc tập tin.
enable -n alias
nếu bạn thích.Các quyền Unix truyền thống hoặc POSIX ACL để bảo vệ các tệp và thư mục.
Đăng nhập thực hiện một lệnh không tương tác. Ví dụ:
foo:x:2001:2001:run foo.sh:/home/foo:/usr/local/bin/foo.sh
Sử dụng các lệnh bắt buộc SSH trên mỗi khóa. Ví dụ:
# ~foo/.ssh/authorized_keys
command="/usr/local/bin/foo.sh" [remainder of line]
Sử dụng tùy chọn OpenSSH ForceCommand với khối Kết hợp có điều kiện.
Sử dụng các công cụ đặc biệt như gitolite hoặc được thiết kế khéo léo cho trường hợp sử dụng cụ thể của bạn.
Sử dụng một nhà tù chroot .
Sử dụng ảo hóa như Xen, OpenVZ, LXC, VMware, VirtualBox hoặc các công nghệ khác để cung cấp một môi trường tách biệt.
Khi bạn đã xác định chính xác mô hình mối đe dọa của mình, bạn có thể xác định các biện pháp kiểm soát phù hợp nhất cho trường hợp sử dụng của mình. Nếu không có một sự hiểu biết có ý nghĩa hơn về lý do tại sao bạn muốn ngăn răng cưa (ví dụ như vấn đề trong thế giới thực thì nó giải quyết được gì?), Bạn không thể chọn các điều khiển thích hợp nhất.
Đây là một nỗ lực vô nghĩa, như câu trả lời của muru cho thấy. Nhưng có một số lựa chọn, nhưng chúng không hoàn hảo.
Theo bash
hướng dẫn, các hàm luôn được ưu tiên hơn các bí danh, do đó chúng ta có thể làm như sau:
xieerqi@eagle:~$ function alias { echo "Aliases are no-no" ; }
xieerqi@eagle:~$ alias TEST='rm'
Aliases are no-no
Bạn có thể đặt định nghĩa hàm vào toàn hệ thống .bashrc
, tuy nhiên như muru đã chỉ ra, người dùng thông minh sẽ tìm cách lấy bí danh bằng cách tìm nguồn của một bashrc
tệp khác chẳng hạn.
Một ý tưởng khác mà tôi đã chơi với là tích enable
hợp sẵn.
alias
là một trình bao được tích hợp sẵn và bash
có enable
lệnh hay cho phép bật hoặc tắt các nội trang. Ví dụ, đây là tôi vô hiệu hóa alias
.
xieerqi@eagle:~$ enable -n alias
xieerqi@eagle:~$ alias
No command 'alias' found, did you mean:
Command '0alias' from package 'zeroinstall-injector' (universe)
alias: command not found
xieerqi@eagle:~$ alias TEST='rm'
No command 'alias' found, did you mean:
Command '0alias' from package 'zeroinstall-injector' (universe)
alias: command not found
xieerqi@eagle:~$ enable alias
xieerqi@eagle:~$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
xieerqi@eagle:~$
Một lần nữa, sử dụng toàn hệ thống bashrc
là một lựa chọn ở đây.
rm
, nó sẽ kiểm tra danh sách. Xem xét rằng các danh sách sẽ khá lớn, sẽ mất nhiều thời gian để bắt đầu, người dùng của bạn sẽ phàn nàn với bạn rất nhiều và ghét bạn với tư cách là quản trị viên hệ thống :)
Bạn có thể định nghĩa (trong /etc/profile
) một hàm được gọi là alias
xác thực mà bạn muốn (có thể đang sử dụng type -p
) (sau khi tất cả "các lệnh mặc định của Ubuntu" là "thực thi trong $PATH
") trước khi gọi hàm dựng alias
, BUT, như những người khác đã chỉ ra, người dùng của bạn có thể nhận được xung quanh đó. Tại sao không lấy một nhóm người dùng khác hoặc giáo dục họ ("Xác định alias
một lệnh ghi đè lệnh là Cách rất tốt để tự bắn vào chân mình và gây nhầm lẫn (ví dụ: Tại sao lại ls
nhắc mật khẩu của tôi?))?