SELinuxポリシー違反をトリガーする方法は?


12

私はSELinuxの基本的な仕組みを研究していますが、拒否をトリガーすることは有益だと思います。私のテストマシンはCentOS 7を実行しており、追加のサービスなしの基本的なサーバーインストールであり、getenforceは「Enforcing」と表示します。だから、/ rootを誰でも読めるようにし、権限のないユーザーとしてそこからファイルを読み取ろうとするとうまくいくと確信しました。しかし、運はありません!誰でも簡単なテストを提案できますか?パスにアクセスしようとする、またはポートを開くなど

理想的には、DACが制限することのない単純なシェルコマンドを探していますが、MACはそれを認識して拒否します。そのため、これを実現するために、特注のプログラムをコンパイルしたり、特定のサービス(Webサーバーなど)をインストールしたりするつもりはありません。これは、SELinuxの動作を確認するための一般的かつ明確な方法を提供するため、貴重です。

DACの変更(つまり、ファイルシステムのアクセス許可)を変更しても問題ありません。テストの一部としてデフォルトよりも制限が緩和されます。


1
保護システムが作動していることを確認できるように保護システムをトリガーする方法を知ることは、不可欠であり、よく見逃されるステップです。
gowenfawr

この質問は、Unix&Linux SEに属しているため、オフトピックとして終了することに投票しています。
マーク

回答:


3

サードパーティ/開発者のコ​​ードのバグ検出におけるSELinuxのユーティリティを示すために、メモリ保護テストがあります(最初のコード例を変更します):

#include <fcntl.h>
#include <stdio.h>
#include <sys/mman.h>

int main (void) {
  // open file read-write, get a memory-mapped pointer with private access, write permission
  int fd = open ("file_to_test", O_RDWR);
  char *p = mmap (NULL, 42, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);

  p[0] = 'a';   // put something

  // Update protection mode; SELinux response depends on sebool: allow_execmod
  int r = mprotect (p, 42, PROT_READ | PROT_EXEC);

  // Display mprotect result
  printf ("mprotect = %d\n", r);

  close(fd);
  return 0;
}
デフォルトをコンパイルして表示する(キャッチされない)
$ echo "test data" > file_to_test
$ gcc execmod.c 

$ ./a.out 
mprotect = 0

$ sudo aureport -a

AVC Report
========================================================
# date time comm subj syscall class permission obj event
========================================================
<no events of interest were found>

ブール値を変更して問題をキャッチします。

$ sudo getsebool allow_execmod
allow_execmod --> on

$ sudo setsebool allow_execmod 0
$ ./a.out 
mprotect = -1

$ sudo aureport -a

AVC Report
========================================================
# date time comm subj syscall class permission obj event
========================================================
1. 04/30/2015 12:26:41 a.out unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 10 file execmod unconfined_u:object_r:user_home_t:s0 denied 3612

これは間違いなく有用であり、十分に文書化されています(+1)。ただし、私はプログラマーではなく、コードを実際に理解していません。理想的には、シェル、netcat、telnetなどの単純なコマンドラインツールを使用して、ポートを開いたりパスにアクセスしたりする試みを拒否するSELinuxの明らかな例をご覧ください。
思慮深い

自分でコードパーツを検索する必要がありました。以下にbashテストを追加してくれてうれしいです。CentOS7のSnortおよびpostfix(おそらくdovecot)エラーはパッケージであり、インストールするのに手間がかかり、後で修正される可能性があり、設定が増えるためです。すでにそのように進んでいる場合、ポリシー生成の練習に役立ちます。
ǝɲǝɲbρɯͽ

3

これは、CentOS 7の基本インストールで同等のDACをバイパスできるMACポリシーを明確に示しています。

  1. デフォルトでは(執筆時点のCentOSで)非特権の非システムユーザーは「unconfined_u」ロールとしてログインします。ただし、システムを変更して、代わりに非特権ユーザー「alice」が「user_u」ロールに配置されるようにすることができます。既定のポリシーを作成して、わずかな追加構成でこの役割を明確に制限できます。

    [root]# echo "alice:user_u:s0-s0:c0.c1023" >> /etc/selinux/targeted/seusers
    
  2. 次に、これらのユーザーがホームディレクトリと/ tmpにあるファイルを実行する機能をオフにします。繰り返しますが、デフォルトではこの動作を許可します。このコマンドは完了するまで少し時間がかかる場合があります。

    [root]# setsebool -P user_exec_content off
    
  3. これで(特権のないユーザーで)ログインして、これらのno goエリアの1つで何かを実行することができます。ご覧のとおり、拒否されました。

    [alice]$ cp /bin/ls /tmp/
    [alice]$ /tmp/ls
    -bash: /tmp/ls: Permission denied
    
  4. 最後に、AVCログを表示して、SELinuxの拒否を確認できます。

    [root]# aureport -a
    
    AVC Report
    ========================================================
    # date time comm subj syscall class permission obj event
    ========================================================
    1. 02/05/15 21:08:33 bash user_u:user_r:user_t:s0 59 file execute user_u:object_r:user_tmp_t:s0 denied 693
    

そうだね!これは間違いなくキャッチされるはずなので、この「execコンテンツなし」アプローチを選んだことを特に気に入っています。私はそもそも実行ファイルの作成を防ぐためにauditdを好む傾向がありましたが、私もこれが好きです。使用例:新しいソフトウェアのインストールを困難にする一般的なクラウドベースのサービスを使用します(パッケージマネージャーを使用する必要があり、sudoはありません)が、ほとんど意味がありません。それらは作成や実行をブロックせず、開発者環境です...必要なパッケージをwget / scpし、コンパイルするだけです。1
ǝɲǝɲbρɯͽ

1

system-config-selinuxのBooleanタブ(または/ etc / selinux / policy)でポリシーを変更していない限り、デフォルトは次のように応答する必要があります(注:さらに深く掘り下げるためにsetroubleshootをインストールすることもできます) :

mkdir -m 755 -p / install / ks

cp /root/anaconda-ks.cfg / install / ks

chmod 644 /install/ks/anaconda-ks.cfg

次に、Webサーバーを再起動し、Webブラウザーでhttp:// localhost / ksにアクセスしてみます。「禁止」メッセージが表示されます。テーリングしている/var/log/audit/audit.log場合、またはを実行している場合ausearch -m avc -ts recentは、次のメッセージが表示されるはずです。type=AVC msg=audit(1391277951.222:266): avc: denied { read } for pid=1731 comm="httpd" name="ks" dev=sda1 ino=22351 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined u:object r:default t:s0 tclass=dir

SELinux chcon -Rv --reference /var/www/html /install/ksを無効にせずにリソースにアクセスできるようにしたい場合は、SELinuxコンテキストを変更できます。

編集:申し訳ありませんが、あなたは「ウェブサーバーではない」と言ったことを見ませんでした。chcon -u fake_u <filename>システムファイルで特権のないアカウントを使用してみてください。


2番目の提案を機能させることができませんでした(新しく作成したユーザーを使用)。また、より一般的なテスト、つまりDACが許可するMACのステップアップの例もあります。これは、SELinuxがSELinuxラベルの管理上の変更からどの程度保護できるかをテストします。
思慮深い

0

2つの小さなパッケージをインストール-依存関係なし

  yum install -y vsftpd lftp

FTPサーバーを起動する

  systemctl start vsftpd

ルートのホームにファイルを作成します

  touch ~/tux.tch

ルートのホームからFTPディレクトリに移動します。
注:移動、コピーしない、またはファイルのfcontextが変更されます

  mv ~/tux.tch /var/ftp/pub

FTPクライアントユーザーとしてFTPサーバーにログインし、新しいファイルにアクセスします。
注:タブの自動補完はここでは機能しません

  lftp localhost
    ls pub/tux.tch
    exit

生ログで拒否を表示する

  grep AVC /var/log/audit/audit.log

またはsetroubleshoot*インストールした場合

  grep sealert /var/log/messages
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.