
我有一個位於 /usr/lib/systemd/system 下的服務。該服務運行我一直在開發的應用程式(.net core 2.0)。相同的應用程式在不同的機器上運行(均為centos7)。他們使用 udp 套接字來找出對方。
在準備之前我已經測試這個應用程式很長一段時間了。為他們歸檔,一切都很順利。他們能夠互相廣播訊息。
當服務運行應用程式時,實例可以獲得的唯一訊息是同一實例首先廣播的訊息。其他機器上也有同樣的情況。他們可以得到自己的廣播,但不能得到對方的廣播。
由於我是 Linux 新手,不確定在哪裡查找以及應該搜尋什麼,所以我遇到了一些無用的信息,這就是為什麼我在這裡需要一些幫助。
謝謝
.service 檔案內容
[Unit]
Description=Apix
[Service]
WorkingDirectory=/apix
ExecStart=/usr/bin/dotnet /APIX/Apix.dll
[Install]
WantedBy=multi-user.target
當我自己啟動應用程式時,我可以看到 udp 連接埠正在被 dotnet 使用。但是當服務運行應用程式時,這條線就會消失。
netstat -lntup
udp 0 0 0.0.0.0:14235 0.0.0.0:* 11319/dotnet
答案1
Dan Walsh 2014 年的 Livejournal有 的描述unconfined_service_t
,儘管其中包含大量 SELinux 術語,恐怕以您當前的 SELinux 知識水平可能無法從中獲得太多資訊。
根據您的評論,該進程的 SELinux 標籤是:
- 當使用 .service 檔案啟動時:
system_u:system_r:unconfined_service_t:s0
- 手動啟動時:
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
SELinux 標籤有四個部分:
- SELinux 用戶(附
_u
後綴) - SELinux角色(附
_r
後綴) - SELinux 類型(附
_t
後綴) - 以及 SELinux 等級定義,僅與完整的多級安全SELinux策略(軍事安全之類),不含默認有針對性的政策。
在 SELinux 預設策略中,SELinux 使用者識別碼與您的常規使用者名稱不同:實際上,SELinux 並不關心任何檔案或進程到底屬於誰,只關心您是基本系統進程還是由 ( system_u
)啟動的進程、管理員( sysadm_u
)、一般使用者 ( user_u
) 或已指定為不受 SELinux 政策限制的使用者 ( unconfined_u
)。
角色部分可用於指定多個「部分管理員」角色,例如dbadm_r
資料庫管理或logadm_r
系統日誌存取。
關於的最重要的部分有針對性的SELinux 策略是型別規範,或是有後綴的部分_t
。
unconfined_service_t
應該是不受限制的類型,所以我不確定那裡出了什麼問題。也許目錄樹下的檔案/APIX/
都沒有標籤,這可能會導致問題?
與進程一樣,檔案也應該有一個 SELinux 標籤,可以使用ls -Z
.一般來說,SELinuxdefault_t
為任何沒有指定標籤的檔案提供一個 。當面對 時default_t
,SELinux 會「想」:「我不知道這是什麼;它可能是丟失了標籤的Ultra Top Secret,所以讓我們保持它的額外安全,直到某個管理員告訴我們它的正確標籤。簡而言之,default_t
這是您需要解決的問題。
檔案通常會繼承建立時所在目錄的標籤,除非指定了 SELinux 規則另有說明。但是,如果您建立新的頂級目錄,例如/APIX
,您需要決定如何標記它,否則您最終會得到default_t
,這可能會導致問題。
您可以嘗試設定semanage permissive -a unconfined_service_t
:它允許任何服務使用unconfined_service_t
免費訪問,同時仍記錄任何 SELinux 策略違規行為,就/var/log/auth/
好像 SELinux 已為它們完全啟用一樣。然後運行audit2why
審計日誌的相關部分應該可以讓您更清楚地描述為什麼 SELinux 阻止程式做它想做的事情。
正確的修復可能只是/APIX/
使用合適的檔案系統標籤來標記目錄。