zaki work log

作業ログやら生活ログやらなんやら

(CentOS7) sudo実行時に/usr/local/binにパスが設定されてないのは何故

結論から書くと、sudoの実行元のユーザのPATH設定・sudoの実行先のユーザ(root)のPATH設定、どちらも関係なく、/etc/sudoersでPATHを再設定しているため。

Defaults    env_reset                                    # 環境変数をクリア

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin  # 環境変数PATHを再設定

この設定により、sudoの元ユーザ・権限変更先ユーザ関係なく、/sbin:/bin:/usr/sbin:/usr/binがPATHに設定されて実行される。

[zaki@registry ~]$ sudo /usr/bin/env | grep PATH
PATH=/sbin:/bin:/usr/sbin:/usr/bin

そのため、例えば/usr/loca/binに置いたdocker-composeコマンドはPATH設定が無いためコマンド名のみだと実行に失敗する。

[zaki@registry ~]$ sudo docker-compose
sudo: docker-compose: コマンドが見つかりません

sudoで/usr/local/binにPATHを通すには

じゃあどうすれば/usr/local/binにPATHを通した状態でsudoできるかというと、

(A) secure_path/usr/local/binも追加する

--- /etc/sudoers.org    2019-10-25 00:23:49.000000000 +0900
+++ /etc/sudoers        2020-03-05 22:45:27.716903825 +0900
@@ -86,5 +86,5 @@
 # Defaults   env_keep += "HOME"
 
-Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
+Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
 
 ## Next comes the main part: which users can run what software on 

この変更を加えたうえで

[zaki@registry ~]$ sudo docker-compose version
docker-compose version 1.25.4, build 8d51620a
docker-py version: 4.1.0
CPython version: 3.7.5
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

動きました。

(B) sudo時にPATHを引き継ぐ

--- /etc/sudoers.org    2019-10-25 00:23:49.000000000 +0900
+++ /etc/sudoers        2020-03-05 22:50:00.429974656 +0900
@@ -86,5 +86,6 @@
 # Defaults   env_keep += "HOME"
 
-Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
+#Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
+Defaults    env_keep += "PATH"
 
 ## Next comes the main part: which users can run what software on 

secure_pathの設定丸ごと削除し、替わりにenv_keepというsudo時に引き継ぎたい環境変数名にPATHを追加(+=)する。

[zaki@registry ~]$ sudo docker-compose version
docker-compose version 1.25.4, build 8d51620a
docker-py version: 4.1.0
CPython version: 3.7.5
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

こちらも動きました


参考

qiita.com


Linuxのお作法としてyumaptなどディストリビューションで管理してるパッケージでインストールしたものは/usr/binに入るけど、自前でmakeしたり管理外のものは/usr/local/binに入れるようになってる。(と昔学習した)

www.atmarkit.co.jp

ので、言い方を変えれば、/usr/local以下は野良アプリが入ってるので、不用意に特権のある状態で実行しないようになっているんだなぁ、と。