Fedora 20マシンで実行されているサービスがあり、開始するとAvahiにサービスを登録しようとします。これは、SELinuxが許可モードのときにサービスが開始された場合は完全に機能しますが、SELinuxが適用されている場合はサービスは登録されません。
SELinuxのhttpd_dbus_avahi
ブール値を知っています。これはApacheがサービスを登録できるようにするために完全に機能しますが、他の特定のサービスがAvahiと通信できるようにする方法に関する多くの情報を見つけることができませんでした。
より具体的には、tvheadendがHTSPサービスをAvahiに登録できるようにしようとしていますが、SELinuxによって停止されずに特定のサービスがAvahiと通信できるようにする方法にも興味があります。 SELinuxをオフにしたり、Avahiと通信したいプロセスを許容的にしたりすることに興味はありません。
編集: tvheadendに関連するすべてのSELinuxおよびサービスユニット情報を追加
--- SELinux ---
audit.logメッセージ
semodule -DB
を実行してtvheadendサービスを再起動した後。以下は、監査ログに表示されたすべてのメッセージです。最後のメッセージは問題のようですが、どうすればいいのかわかりません...
type=SERVICE_STOP msg=audit(1393282994.012:512): pid=1 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:init_t:s0 msg=' comm="tvheadend" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success'
type=SERVICE_START msg=audit(1393283083.635:513): pid=1 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:init_t:s0 msg=' comm="tvheadend" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success'
type=USER_AVC msg=audit(1393283084.291:514): pid=752 uid=81 auid=4294967295 ses=4294967295 subj=system_u:system_r:system_dbusd_t:s0-s0:c0.c1023 msg='avc: denied { send_msg } for msgtype=method_return dest=:1.114 spid=731 tpid=14478 scontext=system_u:system_r:avahi_t:s0 tcontext=system_u:system_r:init_t:s0 tclass=dbus exe="/usr/bin/dbus-daemon" sauid=81 hostname=? addr=? terminal=?'
プロセス
ps -AZ | grep tvheadend
からの出力
system_u:system_r:init_t:s0 2599 ? 00:00:06 tvheadend
私のシステム上の他のすべてのサービスはinit_t
プロセスタイプを持っているため、initrc_t
プロセスタイプは少し奇妙に見えることに気付きました。 tvheadendサービスがこのように異なる理由はわかりません。
ユーザー
Sudo -u hts id
からの出力
uid=1001(hts) gid=1003(hts) groups=1003(hts),39(video) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
このユーザーは、tvheadendサービスを実行するためにのみ使用します。 DVR tvheadendによって生成されたファイルは非常に大きくなる可能性があるため、このユーザーはシステムパーティションよりもはるかに大きい別のパーティションにホームディレクトリを持っています。
このユーザーを作成したとき、useradd
コマンドで--system
スイッチを使用しませんでした。多分私は持っているべきですか?
実行可能
ls -Z /usr/local/bin | grep tvheadend
からの出力
-rwxr-xr-x. root root system_u:object_r:bin_t:s0 tvheadend
---サービス---
ユニットファイル
[Unit]
Description=TVHeadEnd
After=syslog.target network.target avahi-daemon.service sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-dvb-dvb0.demux0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-dvb-dvb0.dvr0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-dvb-dvb0.frontend0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-dvb-dvb0.net0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-dvb-dvb1.demux0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-dvb-dvb1.dvr0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-dvb-dvb1.frontend0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-dvb-dvb1.net0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-video4linux-vbi0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-video4linux-vbi1.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-video4linux-video0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-video4linux-video1.device
Wants=sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-dvb-dvb0.demux0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-dvb-dvb0.dvr0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-dvb-dvb0.frontend0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-dvb-dvb0.net0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-dvb-dvb1.demux0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-dvb-dvb1.dvr0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-dvb-dvb1.frontend0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-dvb-dvb1.net0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-video4linux-vbi0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-video4linux-vbi1.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-video4linux-video0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-video4linux-video1.device
[Service]
Type=forking
GuessMainPID=no
EnvironmentFile=/etc/sysconfig/tvheadend
ExecStart=/usr/local/bin/tvheadend -f -u $TVH_USER -g $TVH_GROUP -p $TVH_PID -b $TVH_ADDRESS --http_port $TVH_HTTP_PORT --htsp_port $TVH_HTSP_PORT
PIDFile=$TVH_PID
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
ユニット環境ファイル
TVH_USER=hts
TVH_GROUP=hts
TVH_PID=/var/run/tvheadend.pid
TVH_ADDRESS=0.0.0.0
TVH_HTTP_PORT=9981
TVH_HTSP_PORT=9982
このサービスをinit_t
として実行することは、おそらく良い考えではありません。
この動作が発生する理由は、tvheadend
がおそらくbin_t
とラベル付けされており、このタイプのファイルをinit_t
から移動するための移行ルールが存在しないためです環境。
これを検索して確実に知ることができます。
$ sesearch -s init_t --type -c process | grep bin_t
このコマンドは結果を返しません。 bin_t
プロセスのinit_tからの遷移はありません。
また、このタイプはサービスに適していないため、initrc_t
でも実行しないでください。一般的な問題として、bestの解決策は、サービスの制限付きポリシーを適切に記述することですが、これはこの回答の範囲を超えています。
代わりに、プロセスをinit_t
から別のタイプに移動する必要があります。このアプリケーションにはポリシーが存在しないため、タイプ遷移が存在するunconfined_t
にこれを移動するのがおそらく最善です。
$ sesearch -s init_t --type -c process -t unconfined_exec_t
Found 1 semantic te rules:
type_transition init_t unconfined_exec_t : process unconfined_t;
ポリシーでヒットしているルールがunconfined_t
でヒットしないことを確認することもできます(ヒットすべきではありません)。
$ sesearch -s avahi_t -p send_msg -c dbus -t unconfined_t --allow
Found 2 semantic av rules:
allow avahi_t unconfined_t : dbus send_msg ;
allow system_bus_type unconfined_t : dbus send_msg ;
これを行うには、tvheadend
プログラムのラベルをunconfined_exec_t
に変更するだけです。
semanage fcontext -a -t unconfined_exec_t -f f /usr/bin/tvheadend
その後、復元します。
restorecon /usr/bin/tvheadend
ここで、サービスを再実行しますshould動作します。 ps -AZ | grep tvheadend
を再実行すると、プロセスがunconfined_t
で実行されていることがわかります。
このプログラムには新しいポリシーを使用するのが理想的ですが、ポリシーが存在しない場合は、unconfined_t
ドメインでポリシーなしで実行するのが最善です。 initrc_t
とinit_t
は、実際にはサービスの実行に使用することを意図したものではありません(ただし、誤ってサービスを実行するものもあります)。initrc_t
は、もともとSYSVシェルスクリプトとinit_t
を実行するために考案されました。 systemd/init自体を実行するためのものです。
Apache_selinux
のマンページには、# semanage permissive
を使用して、特定のプロセスをpermissiveモードで実行できるようにすることができると記載されています。
# semanage permissive -a avahi_t
その使用法についてのより詳細な情報を見つけることをお勧めします
特に、SELinuxが膨大な数の設定オプションを提供して、特定のサービス権限が実行できるようにする場合only実行することexpectそれで実行できること、それ以外は何もありません!ただし、この膨大な数の制御オプションがあるため、管理者はどのオプションが存在するかを学習し、それらを効果的に実装する方法/時期/場所を決定する必要があります。前述したように、最初に確認する場所は、システムのマンページと、/var/log/audit/audit.log
の監査ログです。たとえば、ログファイル内でavahiに関するメッセージを検索するには、次のコマンドを実行します。
# grep /usr/sbin/avahi /var/log/audit/audit.log
編集:更新された質問を反映する
msg=avc: denied { send_msg } for msgtype=method_return dest=:1.114
spid=731 tpid=14478 scontext=system_u:system_r:avahi_t:s0
tcontext=system_u:system_r:init_t:s0
特に次の項目に関心があるはずです。
system_dbusd_t
SELinuxタイプ:
$ man system_dbusd_selinux
avahi_t
SELinuxタイプ:
$ man avahi_selinux
avahi_exec_t
を見てくださいavahi_initrc_exec_t
ファイルコンテキストavahi_var_run_t
avahi_unit_file_t
了解しました。avahi_exec_t
の最後の部分に気づいたかどうかはわかりません。コメントを投稿できないので:/まだ;マンページ自体からの関連情報は次のとおりです。
SELinuxはavahiのファイルコンテキストタイプを定義します。これらのタイプのファイルを別のパスに保存する場合は、semanageコマンドを実行して代替ラベルを指定し、restoreconを使用してラベルをディスクに配置する必要があります。
semanage fcontext -a -t avahi_exec_t '/srv/avahi/content(/.*)?' restorecon -R -v /srv/myavahi_content Note: SELinux often uses regular expressions to specify labels that match multiple files. The following file types are defined for avahi: avahi_exec_t - Set files with the avahi_exec_t type, if you want to transition an executable to the avahi_t domain. Paths: /usr/sbin/avahi-daemon, /usr/sbin/avahi-autoipd, /usr/sbin/avahi-dnsconfd avahi_initrc_exec_t - Set files with the avahi_initrc_exec_t type, if you want to transition an executable to the avahi_initrc_t domain. avahi_unit_file_t - Set files with the avahi_unit_file_t type, if you want to treat the files as avahi unit content.
Dan Walshのブログ SELinuxに関する詳細な議論/情報については、この投稿で特に言及しています。
プロセス遷移は、ラベルa_tとして実行されているプロセスがb_exec_tというラベルの付いたファイルを実行すると、プロセスをb_tとして実行する必要があることを示します。この例としては、サービスhttpd startがあります。この場合、unconfined_tはinitrc_exec_tというラベルの付いたinitスクリプトを実行しており、SELinuxはinitrc_tとしてプロセスを開始します。
それとは別に、tvheadend
プログラムとSELinux管理の調査を続けることが最善の策です。 audit
ログメッセージで提案されているように、カスタムポリシーを作成できます。何かのようなもの:
# grep tvheadend /var/log/audit/audit.log | audit2allow -M mypol
# semodule -i mypol.pp
少なくとも、より良い解決策が見つかるまで、および/またはtvheadend
がFedoraリポジトリに移動します。最後に、systemd
用に作成したユニットファイル(サービスファイル)をよく見てください。エラー、潜在的な追加および変更を確認します。
audit2allow を使用してこれを修正し、カスタムポリシーモジュールを作成できます
audit2allow -M custom_avhi <file_containing_AVC-denied messages
******************** IMPORTANT ***********************
To make this policy package active, execute:
semodule -i custom_avhi.pp