実践Linux
SELinux        SELinux 目次へ  TOP(HOME)へ


SELinux基本設定  2017年9月更新

●動作モード
selinuxには、「permissiveモード」、「enforcingモード」がある。
現在のモードをみるには # getenforce
モードを変える
  # setenforce permissive または 0  → permissive
  # setenforce enforcing または 1  → enforcing
ただし、このコマンドは一時的にモードを切り替えるだけ。PCを再起動すると元に戻る。
恒久的に変更したい場合は、/etc/selinux/configに書き込まれているSELINUX=を直接編集する。

●Selinux
ユーザーにはロール、プロセスにはドメイン、リソースにはタイプといったラベルが付与され、ユーザーはどのドメインを許可されているか、ドメインがタイプに対してどのような操作ができるか(アクセスベクタ)を決めていく。
現在のロールを知るには、 # id -Z
現在動作しているプロセスのドメインを知るには、 # ps -eZ
ディレクトリやファイルのタイプを知るには、 # ls -dZ ファイル(ディレクトリ)
      # ls -Z ディレクトリ  ディレクトリ以下の情報

●booleanによるポリシーの設定
CentOS5ではデフォルトで、targetedポリシーで起動するようになっている。これは、dhcpd、httpd、namedなど、一部が制限を受け、その他はunconfined_tという全く制限を受けないドメインに設定されている。
これは、booleanを使って簡単に各ポリシーを有効にしたり無効にしたりすることができるようになっている。
全ポリシーの内容表示 # getsebool -a | less
ポリシーのON、OFF # setsebool -P ポリシー on

●GUIによる設定(CentOS5に限って。この類のものはあまり使わないので以降インストールしないことにした。)
policycoreutils-guiのインストール。
# yum list installed | grep policy インストールされているかどうかの確認
# yum install policycoreutils-gui インストール
システム→管理→SELinux Management


SELinux の基本コマンド
◆.setenforce
 permissive、enforcingモードを一時的に切り替えるコマンド 。
 # setenforce 0   permissive モード (SELinux の動作を抑える)。
 # setenforce 1   enforce モード (SELinux を動作させる)。

◆ls
 オプションに -Z をつければ、タイプを表示することができる。
 # ls -Z

◆chcon
 ファイルやディレクトリのタイプを変更する。(ただし恒久的ではない。下のsemanage参照。)
 この例では、/var/smb ディレクトリ以下のディレクトリとファイルすべてのタイプを samba_share_t に変更している。
 # chcon -t samba_share_t /var/smb -R
 -u でユーザ、-r でロールを変更できる。

◆restorecon
 タイプの不整合を修正するコマンド。
 # /sbin/restorecon -RF /var/smb
 -Rは再帰的に適用。-Fは強制的に適用(強制でないと変わらないときがある)。

◆setsebool
 各ブーリアンパラメータを変更するコマンド。
 # setsebool -P allow_smbd_anon_write 1
 -Pオプションは、システムを再起動しても設定を反映するようにする。

◆semanage
ファイルに関するタイプのほか、ポートに対するタイプも変更可能なコマンド。
chcon では file_contexts ファイル内の内容は変更できないので、yum update などでポリシーをアップデートした場合は変更内容が消えてしまう。semanage では file_contexts ファイルの内容を書き換えるのでそのような問題は起きない。
 # semanage fcontext -a -t samba_share_t "/var/smb/(/.*)?"
この設定内容を反映させるには restorecon コマンドを使う。
 # restorecon -RF /var/smb
設定内容を削除するには -a の代わりに -d を使用する。
 # semanage fcontext -d -t samba_share_t "/var/smb/(/.*)?"
 # restorecon -RF /var/smb

ポートに対するタイプを見るには
 # semanage port -l
Apache に TCP 8080 番ポートを使えるようにさせるには
 # semanage port -a -t http_port_t -p tcp 8080
ポートの場合は即座に設定が反映される。


実際の運用(CentOS7)

booleanのポリシーは、
 # getsebool -a | less
 # getsebool -a | grep samba
 # getsebool -a | grep smbd
などで調べておくとよい。

●named
# ls -Z /var/named
named_zone_tならばOK。

●samba
@/home/ユーザー以下にアクセスできるようにする。
ポリシーsamba_enable_home_dirsをONにする。
# getsebool -a | less
# getsebool -a | grep samba
# setsebool -P samba_enable_home_dirs 1
Aそれ以外の場所を共有にする場合
そのディレクトリにsamba_share_tタイプを付ける。
# semanage fcontext -a -t samba_share_t "/home/samba(/.*)?"
# restorecon -RF /home/samba

●ftp
booleanのポリシーは、 # getsebool -a | grep ftpで調べておく。
ポリシーftp_home_dirがOFFでも、なぜかホ−ムにアクセスできる。
ホ−ムにアクセスできず、ONにする場合は、
# setsebool -P ftp_home_dir 1

しかし、このままでは /var/www にはアクセスできない(/home関係は、大丈夫だが)。
調査
permissiveモードにする  # setenforce 0
この状態でFTPアクセス。auditのログをとる。
ログが溜まりすぎている場合は、/var/log/audit/audit.logをいったん削除して、auditdサービスを再起動しておく。audit.logが刷新されるので、それからログをとるとよい。(再起動は、# systemctl restart auditdでは失敗する。従来どおりのコマンドで、# service auditd restartで再起動。)
ログから足りない部分を解析する  # audit2allow -a -l -m mylocal これは結果を表示するだけでmylocal.te等は作成されない。これを見てみると、ポリシーftpd_full_access をONにすればよいことがわかる。(多少安易なようだが、とりあえず)
# setsebool -P ftpd_full_access 1

●http
/var/www/htmlはそのままで見ることができるが、ユーザーホームで作成したpublic_html以下はそのままでは見ることはできない。
booleanのポリシーを、 # getsebool -a | grep httpで調べておく。
ポリシーhttpd_enable_homedirsをONにして、ホ−ムにアクセスできるようにする。
# setsebool -P httpd_enable_homedirs 1
以前は作成した各public_htmlに対してSELinuxの設定を反映し直しておく必要があったが、これは必要なくなったようだ。

認証
/var/www/confの場合は、なにもしなくてもパスワードファイルにアクセスできるが、/home/~/confの場合はアクセスできない。
調査
# setenforce 0
# audit2allow -a -l -m mylocal
# setenforce 1
httpd_read_user_contentをonにする必要があることがわかる。
# getsebool -a | grep httpd
# setsebool -P httpd_read_user_content on

●SSH
permissiveモードにする.
# setenforce 0
この状態でSSHアクセス。auditのログをとる。
ログが溜まりすぎている場合は、/var/log/audit/audit.logをいったん削除して、auditdサービスを再起動しておく。audit.logが刷新されるので、それからログをとるとよい。(再起動は、# systemctl restart auditdでは失敗する。従来どおりのコマンドで、# service auditd restartで再起動。)
ログから足りない部分を解析する。
# audit2allow -a -l -m mylocal
これを見ると、ポリシーnis_enabledをONにすればよいことがわかる。
# setsebool -P nis_enabled 1
# setenforce 0


実際の運用(CentOS5)

booleanのポリシーは、
 # getsebool -a | less
 # getsebool -a | grep samba
 # getsebool -a | grep smbd
などで調べておくとよい。

●samba
@/home以下にアクセスできるようにする。
 smbd_tがuser_home_dir_tにアクセスできるようにする。(/homeに作るディレクトリはuser_home_dir_t)
 ポリシーsamba_enable_home_dirsをONにする。
  # setsebool -P samba_enable_home_dirs 1
Aそれ以外の場所を共有にする場合
 そのディレクトリにsamba_share_tタイプを付ける。
  # semanage fcontext -a -t samba_share_t "/var/samba/share(/.*)?"
  # restorecon -RF /var/samba/share
  # ls -Z /var/samba で確認しておく。

●mail関係
 postfix、dovecotはそのままでOK。

●openVPNはunconfined_tで動いている。

●ftp
 booleanのftpd_is_daemonはすでにONになっている。
 /home以下にアクセスできるようにする。
 ポリシーftp_home_dirをONにする。
  # setsebool -P ftp_home_dir 1

●http
booleanのhttpd_builtin_scripting、httpd_enable_cgi、httpd_enable_homedirs、httpd_unified等はすでにONになっている。
しかし/var/www/htmlはそのままで見ることができるが、ユーザーホームで作成したpublic_html以下はそのままで見ることはできない。これはSELinuxのfile_contextsファイルには/home/***/puburic_html以下にはhttpd_sys_content_tタイプを付与するようになっているのだが、puburic_htmlディレクトリを作成したときに親ディレクトリに基づいてuser_home_tが付与されてしまうためである。
これを改善するには、SELinuxの設定を反映し直すだけでよい。
 # restorecon -RF /home/yam/public_html
 # ls -Z /home/yam で確認しておく。

◆CGIを使えるようにする(phpには必要ない)
 httpd_sys_script_tドメインがアクセスできるようにする。
 CGIファイルにhttpd_sys_script_exec_tタイプを付与する。
  # semanage fcontext -a -t httpd_sys_script_exec_t "/home/yam/cgi-bin(/.*)?"
  # restorecon -RF /home/yam/cgi-bin
  # ls -Z /home/yam で確認しておく。
 CGIの書き込み用ファイルにはhttpd_sys_script_rw_tタイプを付与する。
  # semanage fcontext -a -t httpd_sys_script_rw_t "/home/yam/cgi-bin/data.txt"
  # restorecon -F /home/yam/cgi-bin/data.txt
  # ls -dZ /home/yam/cgi-bin/data.txt で確認しておく。

◆phpでデータベースにアクセスできるようにする
 ポリシーhttpd_can_network_connect_dbをONにする。
  # setsebool -P httpd_can_network_connect_db 1

●postgreSQL
 # restorecon -RF /var/lib/pgsql
 # ls -Z /var/lib/pgsql/data 等で確認しておく。


SELinux目次


TOP(HOME)へ

目 次

特別企画
Raspberry Piで遊ぶ

HOME(全体のシステム構成&目次)

CentOS7
CentOS7のインストール〜ネットワークの設定ほか
CentOS7の新機能(systemdとfirewalld)
ダイレクトルールを使ったfirewallの強化
DNS(BIND)サーバー
Webサーバー
  Webでファイルの受け渡し
  アクセス解析ツールAwstats
  Wordpressでブログ構築
  EC-CUBEショッピングサイト構築
FTPサーバー
FTPS(FTP over SSL/TLS)
Mail(Dovecot&Postfix)サーバー
Sambaサーバー
MariaDB(MySQL)サーバー
DHCPサーバー
SSHサーバー
VNCサーバー
ストリーミングサーバーRed5
ドメインの追加

CentOS5〜6
ネットワーク&ファイアウォール(iptables)
DNS(BIND)サーバー
DHCPサーバー
メールサーバー(基本)
メールサーバー/実際の運用
Webサーバー
  WebDAVによるファイル共有
  Webでファイルのやり取り
  アクセス解析ツールawstats
  namazuで全文検索
  WordPressブログサイト構築
  EC-CUBEショッピングサイト構築
FTPサーバー
ファイルサーバー・Samba
データベースpostgreSQL
  ExcelからpostgreSQLを操作
データベースMySQL
SSHサーバー
VNC
SSL/TLSを利用した暗号化通信
openVPN
ストリーミングサーバー
    C++ RTMP Server
    Helix server Basic
ドメインの追加
Xen・仮想化
特定ディレクトリに容量制限

SELinux
SELinux基本設定
audit2allowを使い問題の解決
新しいタイプとポリシー・モジュールを作成してみる
マクロを利用したteファイルの記述
新しいドメインを導入してみる

coLinux
Fedora11で試す

Cプログラミング目次
X11プログラム
サイエンス・プログラム

計測・プログラム
秋月電子のデーターロガーpico ADC-16
「今すぐ使えるパソコン計測USBマイコン基板」に付属のTRZ1102
センサーの使用例

Glade2/GTK+を使ってみる
テキスト・ビューで簡易エディター
ドローイングエリアで自動描画
放物線運動(pango、cairoも試してみる)
これらを、GTK+のみで書き出す

フォントについて
ネットワーク・プログラミング
postgreSQL接続
CGI
ファイル操作

●その他
印刷機関連開発 刷版絵柄面積率測定
数独をExcelで解く