web-dev-qa-db-ja.com

特定のサービスがAvahiと通信できるようにSELinuxを構成するにはどうすればよいですか?

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
4
Louis Daprato

このサービスを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_tinit_tは、実際にはサービスの実行に使用することを意図したものではありません(ただし、誤ってサービスを実行するものもあります)。initrc_tは、もともとSYSVシェルスクリプトとinit_tを実行するために考案されました。 systemd/init自体を実行するためのものです。

6
Matthew Ife

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.

SELinuxとプロセス遷移

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用に作成したユニットファイル(サービスファイル)をよく見てください。エラー、潜在的な追加および変更を確認します。

3
ILMostro_7

audit2allow を使用してこれを修正し、カスタムポリシーモジュールを作成できます

audit2allow -M custom_avhi <file_containing_AVC-denied messages
******************** IMPORTANT ***********************
To make this policy package active, execute:

semodule -i custom_avhi.pp
1
user9517