ターミナルで"zsh compinit: insecure directories, run compaudit for list."が表示された際の対応について
SDKMANをインストールして再起動した際に、ターミナルに下記の内容が表示された。
zsh compinit: insecure directories, run compaudit for list.
Ignore insecure directories and continue [y] or abort compinit [n]?
ざっくり意訳すると
zsh compinitより
安全じゃないディレクトリがあるから、coupauditを実行するよ。
無視するなら"y"、中断するなら"n"を押してね。
という感じだろうか。
compaudit
を実行してみると他の方と同じ回答。
% compaudit
There are insecure directories:
/usr/local/share/zsh/site-functions
/usr/local/share/zsh
zsh completion - zsh compinit: insecure directories - Stack Overflowより原因に関して言及した記述があったので抜粋して引用
Most answers come with a solution, but do not mention why this warning occurs. Here's an excerpt from ZSH's compinit:
For security reasons compinit also checks if the completion system would use files not owned by root or by the current user, or files in directories that are world- or group-writable or that are not owned by root or by the current user. If such files or directories are found, compinit will ask if the completion system should really be used. To avoid these tests and make all files found be used without asking, use the option -u, and to make compinit silently ignore all insecure files and directories use the option -i. This security check is skipped entirely when the -C option is given.
上記をDeepL翻訳
ほとんどの回答には解決策がありますが、この警告が発生する理由については触れていません。これがZSHのcompinitからの抜粋です:
セキュリティ上の理由から、compinitは、補完システムがrootまたは現在のユーザーによって所有されていないファイル、または誰でも書き込み可能またはグループ書き込み可能であるか、rootまたは現在のユーザーによって所有されていないディレクトリ内のファイルを使用するかどうかもチェックします。
そのようなファイルまたはディレクトリが見つかった場合、compinitは補完システムを実際に使用する必要があるかどうかを尋ねます。
これらのテストを回避し、確認されたすべてのファイルを確認せずに使用できるようにするには、オプション-uを使用し、compinitに安全でないすべてのファイルとディレクトリをサイレントに無視させるには、オプション-iを使用します。
-Cオプションを指定すると、このセキュリティチェックは完全にスキップされます。
ざっくり現状整理。
- zshの
compinit
は、安全ではないディレクトリやファイルをチェックしてくれる。 - 安全ではないディレクトリやファイルとは、以下のようなもの。
- ルートユーザーにもログイン中のユーザーにも所有されていないファイル
- 誰でも書き込み可能なディレクトリ内のファイル
- グループ書き込み可能なディレクトリ内のファイル
- ルートユーザーにもログイン中のユーザーにも所有されていないディレクトリ
- そして今回は下記の2ディレクトリが該当した
- /usr/local/share/zsh/site-functions
- /usr/local/share/zsh
なので、これらのディレクトリに適切なアクセス権を付与すれば解決する。
試しに/usr/local/share/zsh
のアクセス権を確認してみる。
確かに所有グループからの書き込みが可能になっている。
zshのcompinit
はこの状況に反応していた模様。
% ls -la | grep zsh
drwxrwxr-x 3 user admin 96 Jun 5 2021 zsh
アクセス権を変更
% chmod 755 /usr/local/share/zsh
% chmod 755 /usr/local/share/zsh/site-functions
アクセス権の変更を確認(zshの例)
% ls -la | grep zsh
drwxr-xr-x 3 user admin 96 Jun 5 2021 zsh
compaudit
の表示が消えることを確認
% compaudit
# 何も表示されない
ターミナル再起動後、当初のメッセージが表示されないことを確認。