gmid on RockyLinux9 (SELinux縛り)
packageとして提供されてないと大変なんだよな、依存関係整えたりするのが
$ dnf install libretls{,-devel} libbsd{,-devel,-ctor-static} libevent{,-devel}
yacc/bisonが足りないことに気がついた
アホ
$ dnf install byacc
$ ./configure
$ make
$ sudo make install
testでえらい怒られてるけど動いたのでok
resource/gmid.serviceとgmid.sysuserを規定の場所に置く
$ cp resource/gmid.service /etc/systemd/system/
$ cp gmid.sysusers /usr/lib/sysusers/gmid.conf
gencertする
なんで自己署名な証明書がgeminiでは主流なのかがわからん
gencertで証明書を生成できる
$ cp ./resource/gencert /usr/local/bin/gencert
$ systemctl edit gmid
code:conf
ExecStart=
ExecStart=/usr/local/bin/gmid -f -c /etc/gmid/gmid.conf
てかgmidさんは、BSDにしかない関数もなければ提供されるのか、えらい!
selinuxのpolicyを生成する
$ sepolicy generate --init -n geminid /usr/local/bin/gmid
$ sepolicy generate --cgi -n geminid /usr/local/bin/gmid
どっちがいいんだろう
initへcgiの参考になりそうなものを入れていくか
これやると、gemini{.te,.pp,.if,.sh,_selinux.spec}が生成される
apache_content_templateってなんやねん
HTTP鯖の設定をそのまま鵜呑みにできないしなあ
とりあえずpolicybuildするか
$ ./geminid.sh
rpmbuildがないと怒られたあ
何をするんだろう、rpmにするんだろうか
$ dnf install rpm-build
そもそもgeminid_selinux.specがrpmbuild用のファイルらしい
てかman pageも生成するのか、すげー
port typeなんやねん
geminid_port_t定義するだけではいかんのか
$ sudo semanage port -a -t geminid_port_t -p tcp 1965
ダメっぽい
corenet_reserved_port(hogehoge_port_t)らしい
systemdで起動すると動かない!
auditにもひっかからなく、stdout/stderrにも出てこないからどこへ吸収されているのやら……
Apache httpdの.teファイルを見様見真似で動かしているがなぜか動かないし、自作moduleに書いたはずのfcontextが反映されないしで厳しい
前者、systemctlで動かすと動かないっぽいが、cgroupが悪さをしている?
systemdから動かせばinit_tからroleが遷移するのに対し、cmdから動かせばunconfined_tからunconfined_tに対しroleが遷移するので、cgroupではなく、SELinuxの正常な動作な説があるな
packet_tが必要?
httpdにもこれが実装されてるんかなあ
$ sesearch -s httpd_t -c packet -A
allow httpd_t http_server_packet_t:packet { recv send }; ←おっ
これ実装すればなんとかなりそう?
どのマクロでpacket_tを定義すればええねん
リファレンスにねーんだが?
とりあえずソース読むか……
これは……?
interfaceってなんやねん!
m4を生成するm4じゃんね
corenet_sendrecv_http_server_packets(httpd_t)
これ、m4をm4で生成してそう
systemdがprocessを起動する段階で問題が起こっているのでは?という仮説の1つ
SELinux、m4で作られてるの真面目に考えるとヤバいな
corenet_tcp_bind_all_unreserved_ports
Bind TCP sockets to all ports > 1024.
geminiは1965なのでこれでもよさそう> corenet_reserved_port
corenet_tcp_bind_generic_node
Bind TCP sockets to generic nodes. This is necessary for binding a socket so it can be used for servers to listen for incoming connections.
corenet_tcp_bind_inetd_child_port
これvgerに使えそう
corenet_tcp_bind_socks_port←これは何?
corenet_tcp_connect_all_portsクソデカ権限っぽそうだけど大丈夫そ?
corenet_tcp_connect_all_unreserved_ports
corenet_tcp_connect_*とcorenet_tcp_bind_*って何が違うん?
corenet_tcp_recv_netlabelとかのnetlabelってなんやねん
unlabelと何が違うねん
なるほど、CMDから指定したport番号からportを指定する感じか
corenet_client_packet
Define type to be a network client packet type
This is for supporting third party modules and its use is not allowed in upstream reference policy.
corenet_server_packet
Define type to be a network server packet type
This is for supporting third party modules and its use is not allowed in upstream reference policy.
なんか、ノリ的にはcorenet_reserved_portよりかはcorenet_portな気がする
code:gmid.te
corenet_port(gmid_port_t)
corenet_client_packet(gmid_client_packet_t)
corenet_server_packet(gmid_server_packet_t)
corenet_tcp_bind_all_unreserved_ports(gmid_t) #added corenet_tcp_bind_generic_node(gmid_t)
corenet_tcp_bind_generic_port(gmid_t)
corenet_tcp_connect_all_unreserved_ports(gmid_t) #added corenet_tcp_sendrecv_generic_if(gmid_t)
corenet_tcp_recvfrom_labeled(gmid_t, gmid_port_t) #added sysnet_dns_name_resolve(gmid_t)
なんか落ちたが
journalctlに手掛かりなし
とりあえずauditを見るか
$ less /var/log/messages
trableshootdをのメッセージがぐちゃぐたでみにくい
どう見るのがいいんだっけか
journalctl -xe じゃんね
$ sealert -l "*"
code:log
***** Plugin restorecon_source (41.9 confidence) suggests *****************
If you want to fix the label.
/usr/local/bin/gmid default label should be bin_t.
Then you can run restorecon.
Do
# /sbin/restorecon -v /usr/local/bin/gmid
え?init_daemon_domainでbin_t付与してくれるもんじゃないん?!
bin_t大丈夫そ??ガバそうだが……
そもそも、gmid_exec_tがそのへんうまくやってくれるんじゃ……
再起動したら直ったが
定義はkernelに入ってたか
port_typeとgmid_t分ける必要なかったのでは?
いや、corenet_tcp_recvfrom_labeledのためには必要だなあ