はじめに
例えばDockerなどのUNIX socketを利用するサービスで、Socketにroot以外の一般ユーザからアクセスしたい場合がある。
サービス起動後に手動でchmod
したり、何らかのScriptなどを用いて権限変更を行ってもよいが、Ad-hocな方法な上、少々面倒くさい。
対応方法
最近のLinuxには、tmpfiles.d
という機構が備わっており、システム起動時にファイルやディレクトリの作成や権限変更を行ってくれたり、定期的に対象ディレクトリ内のファイルをファイルを削除してくれたりする。これを用いて、UNIX Socketファイルの権限付与を管理すると良い。
UNIX Socketの権限変更の設定例
以下に、例としてDockerのSocketファイルをtmpfiles.dで管理する例を示す。
f /var/run/docker.sock 0766 - - - -
まず、最初のf
フラグがファイルの作成を示す。なお、フラグを大文字のF
に指定すると、該当ファイルの内容をクリアし、空ファイルを該当PATHに配置する。
2カラム目に記載されたファイルが存在しなければ空ファイルを作成し、3カラム目の権限を付与する。
3カラム目で、該当PATHの権限を指定する。
4カラム目はUID(ユーザ名), 5カラム目はGID(グループ名), 6カラム目は寿命(Age), 7カラム目にはArgumentが入る。
tmpfils.d
の詳細な使用方法については以下が詳しい。
UNIX Socketファイルは、通常はサービス起動時のみ作成され、サービスを停止すると削除されてしまう。
なので、今回はtmpfils.d
によってシステム起動時に予めUNIX SocketのPathに必要な権限を付与した空ファイルを作成しておき、該当サービス起動時にその空ファイルにOverrideする(つまり権限を引き継ぐ)形でSocketが作成されるようにした。なお、該当サービス終了時にはUNIX Socketの機能は失われ、ただの空ファイルに戻る。
おわりに
UNIX Socketの権限周りは、該当サービスの設定ファイル内で設定できるものも多いが、そうではない場合に再起動時に権限が失われるなどでハマることも多い。
誰かのお役に立てれば幸いです。
参考:
https://www.mk-mode.com/blog/2015/12/08/linux-dir-file-automatic-creation-on-boot/