Linux/SELinux.md
... ...
@@ -1 +1,273 @@
1
-~~#include(SELinux,notitle)~~
... ...
\ No newline at end of file
0
+[[_TOC_]]
1
+
2
+# 管理ツールのインストール
3
+- 管理ツールのパッケージ
4
+```
5
+# yum install setroubleshoot
6
+```
7
+- GUI用追加パッケージ
8
+```
9
+# yum install policycoreutils-gui
10
+```
11
+
12
+# 動作モード切替
13
+- 現在のモードを調べる。
14
+```
15
+# getenforce
16
+```
17
+- 「Enforcing」モードに変更。
18
+```
19
+# setneforce 1
20
+```
21
+- 「Permissive」モードに変更。
22
+```
23
+# setenforce 0
24
+```
25
+- [SELinuxの動作モードをコマンドラインで切り替えるには - @IT](http://www.atmarkit.co.jp/flinux/rensai/linuxtips/979selinuxenforce.html)
26
+
27
+# ログ分析
28
+- ログ分析
29
+```
30
+# sealert -a /var/log/audit/audit.log
31
+```
32
+- 一時許可ポリシーの適用
33
+```
34
+# grep <分析して出てきたキーワード> /var/log/audit/audit.log | audit2allow -M mypol
35
+# semodule -i mypol.pp
36
+```
37
+- 複数の項目を許可するポリシーが必要な場合
38
+ 1. SELinux を Permissive モードに切り替えて該当プログラムを実行し、動かない原因が SELinux であることを確認する。
39
+```
40
+# setenforce 0
41
+```
42
+ 1. 一時許可ポリシーを削除。
43
+```
44
+# semodule -r mypol
45
+```
46
+ 1. ログファイル更新。
47
+```
48
+# service auditd rotate
49
+```
50
+ - 更新に失敗する場合は、auditd の動作確認/再起動を行う。
51
+```
52
+# service auditd status
53
+# service auditd restart
54
+```
55
+ 1. 該当プログラムを実行し、ログを記録する。
56
+ 1. Enforcing モードに戻す。
57
+```
58
+# setenforce 1
59
+```
60
+ 1. ログからポリシーを作成する。
61
+ - 許可すべき項目が不明な場合<br />
62
+「XXX」は自分で決めた名前。
63
+```
64
+# cat /var/log/audit/audit.log | audit2allow -M mypol_XXX
65
+```
66
+ - 許可すべき項目が既知の場合<br />
67
+必要な項目を「\|」で繋げて検索する。
68
+```
69
+# grep "項目1\|項目2\|項目3" /var/log/audit/audit.log | audit2allow -M mypol_XXX
70
+```
71
+ 1. ポリシーの確認<br />
72
+関係ない項目まで許可されていないかどうか確認する。
73
+```
74
+# vi mypol_XXX.te
75
+```
76
+ - ポリシーの手動コンパイル
77
+```
78
+# checkmodule -M -m -o mypol_XXX.mod mypol_XXX.te
79
+# semodule_package -o mypol_XXX.pp -m mypol_XXX.mod
80
+```
81
+ 1. ポリシーをインストール。
82
+```
83
+# semodule -i mypol_XXX.pp
84
+```
85
+
86
+# スクリプト
87
+## コンパイルとインストール
88
+- [installSELPolicy.zip](installSELPolicy.zip)
89
+```bash
90
+#!/bin/bash
91
+
92
+if [ $# -lt 1 ]; then
93
+ echo "usage: $0 <policy.te>"
94
+ echo "SELinux Policy ファイルをコンパイル&インストールします。"
95
+ exit 1
96
+fi
97
+
98
+POLICYNAME="$1"
99
+POLICYNAME=${POLICYNAME##*/}
100
+POLICYNAME=${POLICYNAME%.*}
101
+
102
+checkmodule -M -m -o ${POLICYNAME}.mod ${POLICYNAME}.te
103
+semodule_package -o ${POLICYNAME}.pp -m ${POLICYNAME}.mod
104
+rm -f ${POLICYNAME}.mod
105
+EXIST=`semodule -l | grep ${POLICYNAME}`
106
+if [ -n "$EXIST" ]; then
107
+ semodule -v -r ${POLICYNAME}
108
+fi
109
+semodule -v -i ${POLICYNAME}.pp
110
+```
111
+
112
+## ポリシーをソート
113
+- ポリシーファイルの require 部および { } 内をソートするスクリプト。<br />
114
+[sort_policy.zip](sort_policy.zip)
115
+```perl
116
+#!/usr/bin/perl
117
+
118
+use strict;
119
+use warnings;
120
+use utf8;
121
+
122
+my $fileNameIn = shift or die("usage: sort_policy.pl <infile.te>\n");
123
+my $fileNameOut = $fileNameIn . '.sorted';
124
+
125
+open( my $fhIn, '<', $fileNameIn ) or die( "$fileNameIn: $!\n" );
126
+open( my $fhOut, '>', $fileNameOut ) or die( "$fileNameOut: $!\n" );
127
+
128
+while( my $line = <$fhIn> ){
129
+ if ( $line =~ /^require\s+\{/ ){
130
+ last;
131
+ }
132
+ print $fhOut $line;
133
+}
134
+
135
+print $fhOut "require {\n";
136
+
137
+my @types = ();
138
+my @classes = ();
139
+
140
+while( my $line = <$fhIn> ){
141
+ if ( $line =~ /^\}/ ){
142
+ last;
143
+ }
144
+ $line = sortInBracket( $line );
145
+ if ( $line =~ /^\s+type/ ){
146
+ push( @types, $line );
147
+ } else {
148
+ push( @classes, $line );
149
+ }
150
+}
151
+
152
+print $fhOut sort( @types );
153
+print $fhOut sort( @classes );
154
+
155
+print $fhOut "}\n";
156
+
157
+while( my $line = <$fhIn> ){
158
+ if ( $line =~ /^allow\s/ ){
159
+ $line = sortInBracket( $line );
160
+ }
161
+ print $fhOut $line;
162
+}
163
+
164
+close( $fhIn );
165
+close( $fhOut );
166
+
167
+exit();
168
+
169
+sub sortInBracket
170
+{
171
+ my $line = shift || '';
172
+ $line =~ s<\{\s*([^\}]+)\s*\}><'{ '.join(" ", sort(split(/\s+/, $1))).' }'>e;
173
+ return $line;
174
+}
175
+
176
+# EOF
177
+```
178
+
179
+# ブーリアン値設定
180
+- 現在の設定値を確認 (httpの場合)
181
+```
182
+# getsebool -a | grep http
183
+```
184
+- sshd
185
+```
186
+# setsebool -P nis_enabled 1
187
+```
188
+- ftpd
189
+ - ユーザホームディレクトリの読み書き許可<br />
190
+許可が無いと「500 OOPS: cannot change directory」エラーでログインできない。
191
+```
192
+# setsebool -P ftp_home_dir 1
193
+```
194
+ - ユーザホームディレクトリ外の読み書き許可
195
+```
196
+# setsebool -P allow_ftpd_full_access 1
197
+```
198
+
199
+- httpd
200
+ - メール送信を許可
201
+```
202
+# setsebool -P httpd_can_sendmail 1
203
+```
204
+ - ネットワークアクセスを許可
205
+```
206
+# setsebool -P httpd_can_network_connect 1
207
+```
208
+ - データベースアクセスを許可
209
+```
210
+# setsebool -P httpd_can_network_connect_db 1
211
+```
212
+ - ユーザディレクトリへのアクセスを許可
213
+```
214
+# setsebool -P httpd_read_user_content 1
215
+```
216
+
217
+- named
218
+ - 外部ドメインの名前解決に失敗する(検索結果のキャッシュに失敗している)
219
+```
220
+# setsebool -P named_write_master_zones 1
221
+```
222
+
223
+- smbd
224
+ - ユーザホームディレクトリのアクセスを許可
225
+```
226
+# setsebool -P samba_enable_home_dirs 1
227
+```
228
+ - 共有フォルダの読み書きを許可
229
+```
230
+# setsebool -P samba_export_all_rw 1
231
+```
232
+
233
+# ポート設定
234
+- 許可ポート確認 (POPの場合)
235
+```
236
+# semanage port -l | grep pop_port_t
237
+```
238
+- 許可ポート追加 (POPの場合)
239
+```
240
+# semanage port -a -t pop_port_t -p tcp <追加ポート>
241
+```
242
+
243
+# コンテキスト設定
244
+- /var/www/html, /var/www/cgi-bin 以外にコンテンツを配置する場合、ディレクトリに適切なタイプを設定する必要がある。
245
+- 静的コンテンツ
246
+```
247
+# chcon -R -t httpd_sys_content_t <ディレクトリ>
248
+```
249
+- 動的コンテンツ
250
+```
251
+# chcon -R -t httpd_sys_script_exec_t <ディレクトリ>
252
+```
253
+- コンテキスト確認
254
+```
255
+# ls -lZ
256
+```
257
+
258
+# バグ
259
+## ps コマンドが /proc/<pid> にアクセスしようとしてブロックされる
260
+- ログ例
261
+```
262
+type=AVC msg=audit(xxx.xxx:xxx): avc: denied { getattr } for pid=xxx comm="ps" path="/proc/<pid>" dev=proc
263
+ ino=xxx scontext=unconfined_u:system_r:httpd_sys_script_t:s0 tcontext=system_u:system_r:kernel_t:s0 tclass=dir
264
+```
265
+- sealert 分析結果
266
+```
267
+ps に、 <pid> directory の getattr アクセスがデフォルトで許可されるべきです。
268
+```
269
+- [Bug 982205 – SELinux is preventing /usr/bin/ps from 'getattr' accesses on the directory /proc/<pid>.](https://bugzilla.redhat.com/show_bug.cgi?id=982205)
270
+
271
+# リンク
272
+- [HowTos/SELinux - CentOS Wiki](http://wiki.centos.org/HowTos/SELinux)