こちらの記事はAnsible lint Advent Calendar 2022 18日目の記事になります。
今回はルールrisky-octalについて説明します。
risky-octal
risky-octalはファイルやディレクトリのパーミッションが8進数で記載された場合先頭の0を含む
もしくはu+rwxやu=rw,g=r,o=rなどの記号モードで書かれている
かを検証します。
YAMLで整数または8進数の値を使用すると、予期しない動作になることがあります。たとえば、YAMLローダーは0644を10進数の420として解釈しますが、644と記載すると意図した結果にならない時があります。
以下はパーミッションを設定する機能があるモジュールです。(他にもあるかもしれません)
- ansible.builtin.assemble
- ansible.builtin.copy
- ansible.builtin.file
- ansible.builtin.get_url
- ansible.builtin.replace
- ansible.builtin.template
- community.general.archive
- community.general.ini_file
また上記のそれぞれのAnsibleモジュールのパーミッションの設定項目の説明を見る限り8進数で指定した方が良い
みたいです。
禁止事項として記載はされてはないのですが、u+rwxやu=rw,g=r,o=rなどの記号モード
は採用しない方が良いような雰囲気はそれぞれのモジュールの説明からは読み取れます。
問題のあるコード
---
- name: Example playbook
hosts: localhost
tasks:
- name: Unsafe example of declaring Numeric file permissions
ansible.builtin.file:
path: /etc/foo.conf
owner: foo
group: foo
mode: 644
修正されたコードその1
---
- name: Example playbook
hosts: localhost
tasks:
- name: Safe example of declaring Numeric file permissions (1st solution)
ansible.builtin.file:
path: /etc/foo.conf
owner: foo
group: foo
mode: 0644 # <- 先頭に「0」を付与する
修正されたコードその2
---
- name: Example playbook
hosts: localhost
tasks:
- name: Safe example of declaring Numeric file permissions (2nd solution)
ansible.builtin.file:
path: /etc/foo.conf
owner: foo
group: foo
mode: "0644" # <- ダブルクウォートで囲み文字列に変換する
パーミッションを設定しないとどのような権限でファイルやディレクトリが作成されるのか
しっかり調べてないですがおそらくシステムのunmaskの設定によると思われます。CentOSだとファイル作成時のパーミッションは644、ディレクトリ作成時は775です。これは大きすぎる権限かもしれません。
しかしAnsible lintを採用すればこれらは解決されます。Ansible lintではファイルやディレクトリの作成時はパーミションが付与されていないとエラーになりますがこれはrisky-file-permissionsにより検証されます。
Ansibleでファイルやディレクトリを作成する際は常にパーミッションに注意を払います。