web-dev-qa-db-ja.com

Linuxでユーザーコマンドを制限する方法

グループ「demo」にユーザーがいます。

このユーザーは「vim」、「nano」、「cd」などの10個のコマンドを実行できるというポリシーを設定します。

または、「ssh」コマンドと「cat」コマンドを除くすべてのコマンドにアクセスできるようにポリシーを設定します。

ありがとう

15
mortezaipo

これを実現する方法はたくさんあります。いくつかの可能な解決策の1つをリストします。

ユーザーがアクセスを許可されるべきではないコマンドを実行できないようにするために、いくつかの異なる保護レイヤーを使用することを提案します。ここでの指示はすべて、ユーザーが独自の_/home/[username]_ディレクトリを持ち、シェルが_/bin/bash_であり、システムにログインするときにbashシェルを使用することを想定しています。

1)ユーザーのbashを制限bashモードに変更して、ディレクトリを変更できないようにします(システムに制限bashモードがない場合、 このリンク が役立ち、詳細情報を提供します)_chsh -s /bin/rbash [username]_

2)ユーザーのみがホームディレクトリの内容を編集できるように、ディレクトリのアクセス許可を変更する

_chmod 755 /home/[username]_

3)ユーザーの_.bashrc_ファイルを削除します

_rm /home/[username]/.bashrc_ このサイト には、この状況で_.bashrc_を削除することをお勧めします。

4)_.bash_profile_を作成し、無効にするすべてのコマンドに「安全な」エイリアスを追加します

./ bash_profileファイルの例

_alias apt-get="printf ''"  
alias aptitude="printf ''"  
[...]  
alias vi="vi -Z" #this is vi's safe mode and Shell commands won't be run from within vi
alias alias="printf ''"  
_

詳細については、 bashコマンドの完全なリスト を確認してください。 _alias alias="printf ''"_コマンドがリストの最後のコマンドであることを確認する必要があります。そうしないと、これらすべてのコマンドのエイリアスを作成できなくなります。

以下のコマンドを実行すると、システムで使用可能なほぼすべてのコマンドが検索され、事前作成されたほぼすべての使用可能なコマンドが出力されます。 _[_コマンドは、bashのtest commandです。そのため、ファイルにそれが表示されていれば、エラーではありません。

_#search /bin and /usr/bin for any commands that exist on our system
ls /bin -1 > commands_on_system.txt && ls /usr/bin -1 >> commands_on_system.txt

#format and save this information to a bash variable
IFS=$'\n' GLOBIGNORE='*' command eval  'COMMANDS_ON_SYSTEM=($(cat ./commands_on_system.txt))'
IFS=$'\n' COMMANDS_ON_SYSTEM=($(sort <<<"${COMMANDS_ON_SYSTEM[*]}"))
unset IFS

#save these commands in aliased format for easy usage
for linux_command in "${COMMANDS_ON_SYSTEM[@]}"
do :
   #you can change how this works to automatically
   #setup the command file for you 
   echo "alias ${linux_command}=\"printf ''\"" >> ./startup_functions_for_beginners.sh
done
_

5)viコマンドを制限モードにエイリアスすることにより、viのシェルコマンドを無効にする
構文は_alias vi="vi -Z"_ですが、詳細については このサイト をご覧ください。

6)ユーザーの_.bash_profile_の所有権をrootに変更します
_chown root:root /home/[username]/.bash_profile_

7)最後に、ユーザーの_.bash_profile_に対する書き込み権限を削除します
_chmod 755 /home/[username/.bash_profile]_

ユーザーがログインすると、ディレクトリを変更できなくなり、ユーザーに使用させたくないコマンドはすべて、ユーザーがコマンドを指定せずに_[ENTER]_キーを押した場合と同じ情報を出力します、および_/bin/bash_関数はそのまま残ります。

この方法でエイリアスを作成するかしないかによって、ユーザーは実装したコントロールの一部を回避できる場合があります。ただし、いくつかの安全バッファーを実装しているため、ユーザーは危険なことを行うためにコンピューターシステムについて本当に知る必要があります。

関連する注意事項および考慮したいことについて、これらのエイリアスを各ユーザーの_.bash_profile_に直接配置すると、どの関数をエイリアス化する必要があるか、またはすべきではないかを維持するのが困難になります。すべてのエイリアスを個別に変更する必要がある場合は、エイリアスを変更します。また、ユーザーはvimまたはviを使用してファイルを表示できるため、_.bash_profile_の内容を確認して、自分が持っている制限と持たない制限を理解できます。

これを回避するには、お勧めします。

1)ユーザーがアクセスできないディレクトリにすべてのエイリアスを配置します(_.bash_profile_の内容をここに貼り付けます)

_/[path_to_file]/startup_functions_for_beginners.sh_

2)エイリアスを_.bash_profile_にソースする

./ bash_profileファイルの改善例

_if [[ -f /[path_to_file]/startup_functions_for_beginners.sh ]]; then
    . /[path_to_file]/startup_functions_for_beginners.sh
fi
_

これはあなたを邪魔するはずですが、ほとんどの場合、制限を回避する方法があることを忘れないでください。

また、ニーズに合わせてこの回答の情報を自由に再ミックスしてください。これらは、間違いなく他の多くの制限と組み合わせることができます。

Q:ユーザーにfgおよびbgへのアクセス権が必要ですが、aptitudeまたはbashにアクセスできるようにしたくない

_alias apt-get="printf ''"  #the user won't be able to run this  
alias aptitude="printf ''"  #the user won't be able to run this  
alias bash="printf ''"  #the user won't be able to run this  
#alias fg="printf ''" #this will run as a bash built-in  
#alias bg="printf ''" #you actually don't need to include these in your script  
_

このように一般的なコマンドのリスト ハーバードのウェブサイト (徹底的ではない)

Linuxにプログラムをインストールすると、使用可能なものが変更されます。上記のコマンドをステップ4で実行して、インストール後に新しいコマンドを見つけることをお勧めします。

一部のプログラムではシェルコマンドを実行できるため、エディターには注意が必要です

_nano
emacs
pico
sed
vi
vim  
_

その他すべて

_exit
logout
passwd
rlogin
ssh
slogin
yppasswd
mail
mesg
pine
talk
write
as
awk
bc
cc
csh
dbx
f77
gdb
gprof
kill
ld
Lex
lint
make
maple
math
Nice
Nohup
pc
Perl
prof
python
sh
yacc
xcalc
apropos
find
info
man
whatis
whereis
cd
chmod
chown
chgrp
cmp
comm
cp
crypt
diff
file
grep
gzip
ln
ls
lsof
mkdir
mv
pwd
quota
rm
rmdir
stat
sync
sort
tar
tee
tr
umask
uncompress
uniq
wc
cat
fold
head
lpq
lpr
lprm
more
less
page
pr
tail
zcat
xv
gv
xpdf
ftp
rsync
scp
alias
chquota
chsh
clear
echo
pbm
popd
pushd
script
setenv
stty
netstat
rsh
ssh
bg
fg
jobs
^y
^z
clock
date
df
du
env
finger
history
last
lpq
manpath
printenv
ps
pwd
set
spend
stty
time
top
uptime
w
who
whois
whoami
gimp
xfig
xv
xvscan
xpaint
kpaint
mplayer
realplay
timidity
xmms
abiword
addbib
col
diction
diffmk
dvips
explain
grap
hyphen
ispell
latex
pdfelatex
latex2html
lookbib
macref
ndx
neqn
nroff
pic
psdit
ptx
refer
roffbib
sortbib
spell
ispell
style
tbl
tex
tpic
wget
grabmode
import
xdpyinfo
xkill
xlock
xterm
xwininfo
html2ps
latex2html
lynx
netscape
sitecopy
weblint
_
17
Dodzi Dzakuma

私はパーティーに遅れており、実際には2年遅れていることを知っていますが、今あなたの状況の回避策を見つけました。私にはユーザーがいました。「su」など、いくつかのコマンドを制限する必要がある「test1」と呼びましょうが、残りは使用可能です。この制限を適用するために、コマンド自体の背後にあるバイナリファイルでACLを使用しました(FSでACLが有効になっていると仮定):

setfacl -m u:test1:r/bin/su

上記のコマンドは、特定のバイナリファイル(実際は "su"コマンド)のアクセス許可を変更して、ユーザー "test1"にそのファイルへの読み取りアクセスのみを許可します。そのため、ユーザー「test1」が「su」コマンドを「実行」しようとすると、その背後でスクリプトを実行できず、「Permission denied」が取得されます。

「which command_you_want_restricted」を実行して、背後のファイルを確認します。

Red Hat 6.5および7でこの方法をテストしましたが、ユーザー「test1」に影響するだけで、他のすべてのユーザーは意のままに「su」を実行できます。

あなたの特定のリクエストに関して:

「または、「ssh」および「cat」コマンドを除くすべてのコマンドにアクセスできるようにポリシーを設定します。」

あなたが望むコマンドバイナリのグループ「デモ」のACLで同じことを行うことができますが、グループでこれをテストしていないので、テストVMまたは何かで試してみることをお勧めします予め。

よろしく、

8
AnythingIsFine

@Dodzi Dzakumaソリューションは、無効にするコマンドが数個しかない場合に最適です。

ただし、ユーザーに複数のコマンドの実行のみを許可する場合は、こちらがより良い解決策です:

  1. ユーザーシェルを制限付きbashに変更します

    chsh -s /bin/rbash <username>
    
  2. ユーザーのホームディレクトリの下にbinディレクトリを作成します

    Sudo mkdir /home/<username>/bin
    Sudo chmod 755 /home/<username>/bin
    
  3. ユーザーのデフォルトPATHをbinディレクトリに変更します

    echo "PATH=$HOME/bin" >> /home/<username>/.bashrc
    echo "export PATH >> /home/<username>/.bashrc
    
  4. ユーザーが必要とするコマンドのシンボリックリンクを作成します

    Sudo ln -s /bin/<command> /home/<username>/bin/
    
  5. ユーザーが〜/ .bashrcを変更できないようにする

    chattr +i /home/<username>/.bashrc
    

すべての可能なコマンドのエイリアスを設定して無効にするのではなく、許可するコマンドのシンボリックリンクのみを設定するため、ユーザーに複数のコマンドの実行のみを許可する場合は、これが優れています。

5
Victor Wong

標準的な答えは、制限されたシェルを使用し、これをそのグループのユーザーのパスワードファイルの最後のエントリにすることです。 vimのようなものから外部コマンドを実行できるように: http://web.physics.ucsb.edu/~pcs/apps/editors/vi/vi_unix.html

制限された環境を作成しようとしている場合、これは素晴らしいアイデアとは思えません。ユーザーが最初にできることは、上記のリンクのコマンドを使用して/bin/bashそして彼は制限された環境の外にいるだろう。

より良いアイデアは、各ユーザーのログインをchroot jailまたはおそらく軽量コンテナーに入れることです(したがって、ユーザーが何かを壊す場合は、それは自分のコンテナーです)。 Dockerをご覧ください- http://docker.io .

5
abligh

答えにネイティブSSH機能をまだ誰も使用していないことに少し驚いています...私は4年遅れていることを知っていますが、まだ便利です:)

SSHを使用する場合は、ログインにキーを使用する必要があります。サーバーの保護について説明しているように、パスワードログインを無効にすることは、最初に行うべきことの1つです。したがって、キーを使用している場合、これをauthorized_keysファイルに追加することにより、キーごとに1つのコマンドのみを許可することができます。

command="only" ssh-rsa AAABBBCC....

onlyコマンドは、ユーザーがこれらのコマンドのみを実行できるようにするホワイトリスト機能です。デフォルトのバイナリパーミッションを変更することにより、システムで例外を作成する必要はありません(これは管理者の地獄です)。 authorized_keysファイルがユーザーに対して書き込み不可に設定されていることを確認してください。

唯一のコマンドは、/usr/bin/に775権限でインストールする必要があるスクリプトです。

それについてのすべてをお読みください: OnlySSH強制コマンドの方法

これで仕組みがわかったので、ユーザーに実行を許可するコマンドをホワイトリストに追加するだけです。

command="only cal cowsay factor figlet fortune" ssh-rsa AAABBBCC....

または、適切な構文で.onlyrulesファイルを使用します。貪欲な正規表現を使用しないように注意してください。

  ----------------------
  <   I'm restricted   >
  ----------------------
         \   ^__^ 
          \  (oo)\_______
             (__)\       )\/\
                 ||----w |
                 ||     ||
3
Robbert

特定のコマンドのみにアクセスするように人々を制限しなければならなかった組織で、同様の状況に直面しました。

これまでのところ、2つの異なる方法を見つけました。

  1. のみ アプローチ
  2. 完全に異なるシェルを持つこと。 rbashlshelldockersh

ここに私の考えがあります。

  1. ユーザーがログインして特定のコマンドを実行し、シェルを完全に終了するようにしたい場合は、唯一のアプローチを取ります。 Rbash と組み合わせて使用​​する方が良いでしょう。

  2. 3つのシェルのうち、特にUbuntuとその派生物を使用している場合は、 lshell を実装するのが最も簡単だと思います。 aptを介してパッケージをインストールし、構成を編集するだけです。最も簡単です。

rbash は、リダイレクトやCLIの特定の文字をブロックするなどの基本的なものには適していますが、特定のコマンドをホワイトリストに登録するなどの高度なものを行うには、余分な距離を移動する必要があります。

Dockersh は、シェルを制限するための完全に最新のアプローチです。ここではすべてを許可しますが、ユーザーのすべてのアクションをコンテナに制限します。

私のユースケースでは、シェルベースのリダイレクト、パイピングなどがオフになっている単一のコマンドにユーザーを制限する必要があったため、 lshell を選択しました。構成に5分もかかりませんでした。詳細を検索 こちら

1
Shammi Shailaj