Ngăn chặn tất cả các lệnh được định nghĩa là bí danh


10

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 rmhoặ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.


bạn có ý nghĩa gì chính xác? Bạn đang tìm kiếm một cái gì đó giống như một "khối mềm" để ngăn mình vô tình làm điều đó?
kos

4
Tôi không chắc quan điểm của việc đó là gì, ngay cả khi điều đó là có thể.
muru

4
logic của việc này là gì? Nó không ngăn người dùng gõ lệnh thực tế ... vì vậy tôi thấy không có lý do gì để bất cứ ai cần phải chặn bí danh?
Rinzwind

2
Giống như muru và Rinzwind đã nói, vấn đề là gì? Bí danh không thể làm những điều khó khăn hơn những điều người dùng được phép làm, việc chặn bí danh chỉ khiến cuộc sống của người dùng trở nên khó khăn hơn. Ngoài ra, bất kể giải pháp nào sẽ là (ví dụ: sử dụng bí danh / hàm để ghi đè tích hợp) Tôi không thể nghĩ ra cách nào để làm cho nó không bị phá vỡ bởi chính người dùng, trừ khi bằng cách khóa chúng ~/.bashrc.
kos

Không chặn tất cả bí danh, chỉ ngăn anh ấy / cô ấy không sử dụng tên lệnh mặc định làm tên bí danh. Tôi biết chúng ta có thể thoát các bí danh bằng nhiều cách như sử dụng \ với cùng một lệnh bí danh để chạy lệnh thực tế. Đó là tất cả
αғsнιη

Câu trả lời:


24

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:

  1. Bạn vô hiệu hóa bí danh trong /etc/bash.bashrc. Họ cho phép nó bất cứ nơi nào họ chọn.
  2. Bạn xóa tất cả các đề cập của bí danh /etc/bash.bashrc, và tất cả ~/.bashrc~/.bash_aliasesthô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ó.
  3. Bạn chạy một lệnh trong 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.
  4. Bạn bẫy DEBUGvà xác định bí danh. Họ gỡ bẫy.
  5. Bạn chown tất cả các tập tin có nguồn gốc từ lời mời đến root. Họ sử dụng một tệp khác và lấy nó bằng tay như lệnh đầu tiên họ chạy.
  6. Bạn vô hiệu hóa các lệnh nội trú unset, builtinenable; làm aliasmộ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/bashcùng --rcfile--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.
  7. ...

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ọ.


4
Tôi đã có một ý tưởng hài hước mặc dù: bạn có thể bí danh: =)
Rinzwind

4
Và họ unalias alias.
muru

4
@muru chắc chắn nhưng bạn cũng có thể bí danh unalias: +
Rinzwind

8
@Rinzwind và họ chạy \unalias unalias.
muru

10

TL; DR

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ế.

Sử dụng Shell bị hạn chế Bash

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

Hãy cẩn thận

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õ bashvà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.

Lựa chọn tốt hơn

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 -icp -itrong /etc/bash.bashrc tập tin.

    • Cho ví dụ ban đầu của bạn, đây có lẽ là giải pháp hợp lý nhất.
    • Bạn có thể kết hợp điều này với enable -n aliasnếu bạn thích.
    • Điều này sẽ không ngăn người dùng có kiến ​​thức thay đổi bí danh, nhưng nó có thể đủ để ngăn người dùng không có kỹ thuật làm bất cứ điều gì bạn quan tâm.
  • 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.


+1 nói chung, nhưng cũng đặc biệt để phân loại đây là sự cố X / Y.
Joe

5

Đâ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 bashhướ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 bashrctệp khác chẳng hạn.

Một ý tưởng khác mà tôi đã chơi với là tích enablehợp sẵn. aliaslà một trình bao được tích hợp sẵn và bashenablelệ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 bashrclà một lựa chọn ở đây.


Không chặn tất cả các bí danh, chỉ được xây dựng trong các lệnh không alias bản thân :)
αғsнιη

@ Afshin.Hamedi Vâng, lệnh mặc định là gì? Cái nào đi kèm với Ubuntu? Điều đó có nghĩa là bạn phải có một danh sách tất cả các lệnh (tệp nhị phân) đi kèm với cài đặt mặc định. Sau đó, mỗi khi người dùng tải shell hoặc cố gắng bí danh một cái gì đó 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 :)
Sergiy Kolodyazhnyy

Đó là một câu hỏi thú vị, tuyệt vời mà bạn có, tôi thích nó! Bí danh chọn lọc sẽ tốt đẹp. Nhưng tôi nghi ngờ điều đó có thể đạt được, trừ khi các nhà phát triển shell thấy cần phải thực hiện nó :)
Sergiy Kolodyazhnyy

Ý tưởng chức năng là tốt đẹp. Nó đến gần nhất.
muru

0

Bạn có thể định nghĩa (trong /etc/profile) một hàm được gọi là aliasxá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 aliasmộ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 lsnhắc mật khẩu của tôi?))?

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.