ресурс файла
Используйте ресурс проверки file Chef InSpec, чтобы проверить все типы системных файлов, включая файлы, каталоги, символические ссылки, именованные каналы, сокеты, символьные устройства, блочные устройства и двери.
Доступность
Установка
Этот ресурс распространяется вместе с самим Chef InSpec. Вы можете использовать его автоматически.
Версия
Этот ресурс стал доступен в версии v1.0.0 InSpec.
Синтаксис
Блок ресурса file объявляет расположение типа файла, который необходимо проверить, ожидаемый тип файла (если требуется) и одно (или несколько) свойств ресурса.
describe file('path') do
it { should PROPERTY 'value' }
end
где
-
('path')— имя файла и/или путь к файлу. -
PROPERTY— допустимое свойство ресурса для этого ресурса. -
'value'— значение, которое нужно проверить.
Свойства
Общие свойства
contentsizebasenamepathownergrouptype
Свойства Unix/Linux
symlinkmodelink_pathshallow_link_pathmtimesizeselinux_labelmd5sumsha256sumpathsourcesource_pathuidgid
Свойства Windows
file_versionproduct_version
Примеры свойств ресурса
content
Свойство content проверяет, совпадают ли содержимое файла с указанным значением в регулярном выражении. Значения свойства content произвольны и зависят от типа файла, который проверяется, а также от типа информации, которая ожидается в этом файле:
its('content') { should match REGEX }
Следующий полный пример проверяет файл pg_hba.conf в PostgreSQL на соответствие требованиям MD5. Тесты проверяют все параметры host и local в этом файле и затем сравнивают контрольные суммы MD5 со значениями в тесте:
describe file('/etc/postgresql/9.1/main/pg_hba.conf') do
its('content') { should match(%r{local\s.*?all\s.*?all\s.*?md5}) }
its('content') { should match(%r{host\s.*?all\s.*?all\s.*?127.0.0.1\/32\s.*?md5}) }
its('content') { should match(%r{host\s.*?all\s.*?all\s.*?::1\/128\s.*?md5}) }
end
file_version
Свойство file_version проверяет, соответствует ли версия файла Windows указанному значению. Разница между «версией файла» и «версией продукта» заключается в том, что версия файла — это номер версии самого файла, а версия продукта — это номер версии, связанный с приложением, из которого происходит этот файл:
its('file_version') { should eq '1.2.3' }
group
Свойство group проверяет, соответствует ли группа, к которой принадлежит файл, указанному значению.
its('group') { should eq 'admins' }
Следующие примеры показывают, как использовать этот ресурс аудита Chef InSpec.
link_path
Свойство link_path проверяет, существует ли файл по указанному пути. Если файл является символической ссылкой, Chef InSpec рекурсивно разрешит символическую ссылку и вернёт конечный связанный файл.
its('link_path') { should eq '/some/path/to/file' }
shallow_link_path
Свойство shallow_link_path возвращает путь, к которому ссылается файл, разрешая его только один раз (то есть, выполняет операцию readlink). Если файл не является символической ссылкой, возвращается nil.
its('shallow_link_path') { should eq '/some/path/to/file' }
md5sum
Свойство md5sum проверяет, соответствует ли контрольная сумма MD5 файла указанному значению.
its('md5sum') { should eq '3329x3hf9130gjs9jlasf2305mx91s4j' }
mode
Свойство mode проверяет, соответствует ли разрешение, назначенное файлу, указанному значению.
its('mode') { should cmp '0644' }
Значения Chef InSpec в восьмеричной системе счисления начинаются с цифры ноль.
Например, запишите:
{ should cmp '0644' }
а не
{ should cmp '644' }
или запишите:
{ should cmp '01775' }
а не
{ should cmp '1775' }
Без префикса ноль для восьмеричного значения Chef InSpec интерпретирует его как десятичное значение 644, что соответствует восьмеричному 1024 или -----w-r-T, и любой тест для файла, который -rw-r--r-- , завершится неудачей.
Примечание: см. be_more_permissive_than(mode) для соответствия верхней и нижней границ разрешений файла.
mtime
Свойство mtime проверяет, соответствует ли время последнего изменения файла указанному значению. Значение mtime, где поддерживается, возвращается как количество секунд с эпохи.
describe file('/') do
its('mtime') { should <= Time.now.to_i }
its('mtime') { should >= Time.now.to_i - 1000 }
end
owner
Свойство owner проверяет, соответствует ли владелец файла указанному значению.
its('owner') { should eq 'root' }
product_version
Свойство product_version проверяет, соответствует ли версия продукта файла Windows указанному значению. Разница между «версией файла» и «версией продукта» заключается в том, что версия файла — это номер версии самого файла, а версия продукта — это номер версии, связанный с приложением, из которого происходит этот файл.
its('product_version') { should eq '2.3.4' }
selinux_label
Свойство selinux_label проверяет, соответствует ли метка SELinux файла указанному значению.
its('selinux_label') { should eq 'system_u:system_r:httpd_t:s0' }
sha256sum
Свойство sha256sum проверяет, соответствует ли контрольная сумма SHA-256 файла указанному значению.
its('sha256sum') { should eq 'b837ch38lh19bb8eaopl8jvxwd2e4g58jn9lkho1w3ed9jbkeicalplaad9k0pjn' }
size
Свойство size проверяет, соответствует ли размер файла указанному значению, больше ли он или меньше. Например, равно:
its('size') { should eq 32375 }
Больше, чем:
its('size') { should > 64 }
Меньше, чем:
its('size') { should < 10240 }
type
Свойство type проверяет тип файла. Доступные типы:
file- объект является файлом
directory- объект является каталогом
link- объект является символической ссылкой
pipe- объект является именованным каналом
socket- объект является сокетом
character_device- объект является символьным устройством
block_device- объект является блочным устройством
door- объект является устройством двери
Метод type обычно возвращает тип как Ruby «символ». Рекомендуется использовать соответствие cmp для соответствия символом или строкой.
Например:
its('type') { should eq :file }
its('type') { should cmp 'file' }
или:
its('type') { should eq :socket }
its('type') { should cmp 'socket' }
Проверка содержимого файла на соответствие требованиям MD5
describe file('/etc/postgresql/9.1/main/pg_hba.conf') do
its('content') { should match /local\s.*?all\s.*?all\s.*?md5/ }
its('content') { should match %r{/host\s.*?all\s.*?all\s.*?127.0.0.1\/32\s.*?md5/} }
its('content') { should match %r{/host\s.*?all\s.*?all\s.*?::1\/128\s.*?md5/} }
end
Проверка существования файла
describe file('/tmp') do
it { should exist }
end
Проверка отсутствия файла
describe file('/tmpest') do
it { should_not exist }
end
Проверка, является ли путь каталогом
describe file('/tmp') do
its('type') { should eq :directory }
it { should be_directory }
end
Проверка, является ли путь файлом, а не каталогом
describe file('/proc/version') do
its('type') { should cmp 'file' }
it { should be_file }
it { should_not be_directory }
end
Проверка, является ли файл символической ссылкой
describe file('/dev/stdout') do
its('type') { should cmp 'symlink' }
it { should be_symlink }
it { should_not be_file }
it { should_not be_directory }
end
Проверка, является ли файл символьным устройством
describe file('/dev/zero') do
its('type') { should cmp 'character' }
it { should be_character_device }
it { should_not be_file }
it { should_not be_directory }
end
Проверка, является ли файл блочным устройством
describe file('/dev/zero') do
its('type') { should cmp 'block' }
it { should be_character_device }
it { should_not be_file }
it { should_not be_directory }
end
Проверка разрешений файла
describe file('/dev') do
its('mode') { should cmp '00755' }
end
Проверка владельца файла
describe file('/root') do
its('owner') { should eq 'root' }
end
Проверка, принадлежит ли файл пользователю root
describe file('/dev') do
it { should be_owned_by 'root' }
end
Проверка времени последнего изменения файла
describe file('/') do
its('mtime') { should <= Time.now.to_i }
its('mtime') { should >= Time.now.to_i - 1000 }
end
Проверка размера файла в диапазоне от 64 до 10240
describe file('/') do
its('size') { should be > 64 }
its('size') { should be < 10240 }
end
Проверка, равен ли размер файла нулю
describe file('/proc/cpuinfo') do
its('size') { should be 0 }
end
Проверка контрольной суммы MD5
require 'digest'
cpuinfo = file('/proc/cpuinfo').content
md5sum = Digest::MD5.hexdigest(cpuinfo)
describe file('/proc/cpuinfo') do
its('md5sum') { should eq md5sum }
end
Проверка контрольной суммы SHA-256
require 'digest'
cpuinfo = file('/proc/cpuinfo').content
sha256sum = Digest::SHA256.hexdigest(cpuinfo)
describe file('/proc/cpuinfo') do
its('sha256sum') { should eq sha256sum }
end
Проверка NTP
Следующий пример демонстрирует, как использовать ресурс аудита file для проверки наличия файлов ntp.conf и leap-seconds, а затем ресурс command для проверки установки и работы NTP:
describe file('/etc/ntp.conf') do
it { should be_file }
end
describe file('/etc/ntp.leapseconds') do
it { should be_file }
end
describe command('pgrep ntp') do
its('exit_status') { should eq 0 }
end
Проверка параметров символической ссылки
Если вам нужно проверить параметры целевого файла для символической ссылки, вы можете использовать метод link_path (рекурсивное разрешение) или shallow_link_path (прямая ссылка) для ресурса file.
Например, для следующей символической ссылки:
lrwxrwxrwx. 1 root root 11 03-10 17:56 /dev/virtio-ports/com.redhat.rhevm.vdsm -> ../vport2p1
… вы можете написать правила как для ссылки, так и для целевого файла.
describe file('/dev/virtio-ports/com.redhat.rhevm.vdsm') do
it { should be_symlink }
end
virito_port_vdsm = file('/dev/virtio-ports/com.redhat.rhevm.vdsm').link_path
describe file(virito_port_vdsm) do
it { should exist }
it { should be_character_device }
it { should be_owned_by 'ovirtagent' }
it { should be_grouped_into 'ovirtagent' }
end
Сопоставители
Полный список доступных сопоставителей см. на нашей странице сопоставителей.
be_allowed
Сопоставитель be_allowed проверяет, содержит ли файл определенный набор разрешений, например execute или write в Unix и full-control или modify в Windows.
it { should be_allowed('read') }
Так же, как и с be_executable и другими разрешениями, можно проверить разрешение относительно конкретного пользователя или группы.
it { should be_allowed('full-control', by_user: 'MyComputerName\Administrator') }
ИЛИ
it { should be_allowed('write', by: 'root') }
be_block_device
Сопоставитель be_block_device проверяет, существует ли файл как блочное устройство, например /dev/disk0 или /dev/disk0s9:
it { should be_block_device }
be_character_device
Сопоставитель be_character_device проверяет, существует ли файл как символьное устройство (соответствующее блочному устройству), например /dev/rdisk0 или /dev/rdisk0s9:
it { should be_character_device }
be_directory
Сопоставитель be_directory проверяет, существует ли файл как каталог, например /etc/passwd, /etc/shadow, или /var/log/httpd:
it { should be_directory }
be_executable
Сопоставитель be_executable проверяет, существует ли файл как исполняемый:
it { should be_executable }
Матчер be_executable также может проверить, разрешено ли исполнение файла конкретным владельцем, группой или пользователем. Например, группой:
it { should be_executable.by('group') }
владельцем:
it { should be_executable.by('owner') }
любым пользователем, кроме владельца или членов группы файла:
it { should be_executable.by('others') }
пользователем:
it { should be_executable.by_user('user') }
be_file
Матчер be_file проверяет, существует ли файл как файл. Это может быть полезно с файлами конфигурации, такими как /etc/passwd, где, как правило, нет связанного расширения файла — passwd.txt:
it { should be_file }
be_grouped_into
Матчер be_grouped_into проверяет, существует ли файл как часть указанной группы:
it { should be_grouped_into 'group' }
be_linked_to
Матчер be_linked_to проверяет, является ли файл ссылкой на указанный целевой объект:
it { should be_linked_to '/etc/target-file' }
be_owned_by
Матчер be_owned_by проверяет, является ли файл владельцем указанного пользователя, например root:
it { should be_owned_by 'root' }
be_pipe
Матчер be_pipe проверяет, существует ли файл как специальный файл ввода-вывода (.fifo), обычно используемый для определения именованной очереди, такой как /var/log/nginx/access.log.fifo:
it { should be_pipe }
be_readable
Матчер be_readable проверяет, читается ли файл:
it { should be_readable }
Матчер be_readable также может проверить, разрешен ли чтение файла конкретным владельцем, группой или пользователем. Например, группой:
it { should be_readable.by('group') }
владельцем:
it { should be_readable.by('owner') }
любым пользователем, кроме владельца или членов группы файла:
it { should be_readable.by('others') }
пользователем:
it { should be_readable.by_user('user') }
be_setgid
Матчер be_setgid проверяет, установлен ли разрешение «setgid» для файла или каталога. Для исполняемых файлов это приводит к запуску процесса от имени группы, владеющей файлом, а не от имени основной группы вызывающего пользователя. Это может привести к повышению привилегий. В Linux, при установке setgid на каталоги, setgid заставляет вновь созданные файлы и каталоги принадлежать группе, владеющей родительским каталогом setgid; кроме того, вновь созданные подкаталоги будут иметь установлен бит setgid. Для использования этого матчера:
it { should be_setgid }
be_socket
Матчер be_socket проверяет, существует ли файл как сокет (.sock), такой как /var/run/php-fpm.sock:
it { should be_socket }
be_sticky
Матчер be_sticky проверяет, установлен ли разрешение «sticky bit» для каталога. В каталогах это ограничивает удаление файлов владельцем файла, даже если права родительского каталога обычно разрешают удаление другими. Это часто используется в файловых системах /tmp. Для использования этого матчера:
it { should be_sticky }
be_setuid
Матчер be_setuid проверяет, установлен ли разрешение «setuid» для файла. Для исполняемых файлов это приводит к запуску процесса от имени пользователя, владеющего файлом, а не вызывающего пользователя. Это может привести к повышению привилегий. Для использования этого матчера:
it { should be_setuid }
be_symlink
Матчер be_symlink проверяет, существует ли файл как символическая, или мягкая ссылка, содержащая абсолютный или относительный путь к другому файлу:
it { should be_symlink }
be_version
Матчер be_version проверяет версию файла:
it { should be_version '1.2.3' }
be_writable
Матчер be_writable проверяет, записывается ли файл:
it { should be_writable }
Матчер be_writable также может проверить, разрешена ли запись файла конкретным владельцем, группой или пользователем. Например, группой:
it { should be_writable.by('group') }
владельцем:
it { should be_writable.by('owner') }
любым пользователем, кроме владельца или членов группы файла:
it { should be_writable.by('others') }
пользователем:
it { should be_writable.by_user('user') }
exist
Матчер exist проверяет, существует ли указанный файл:
it { should exist }
have_mode
Матчер have_mode проверяет, есть ли у файла назначенный режим:
it { should have_mode }
be_more_permissive_than(mode)
be_more_permissive_than(mode) принимает максимальный желаемый режим — в octal format (‘0644’ или ‘0777’) — вашего файла в качестве String и возвращает Boolean. Он вернёт true если у вашего файла установлен режим с более широкими правами, чем указано.
describe file('/etc/passwd') do
it { should_not be_more_permissive_than('0644') }
it { should be_more_permissive_than('0000') }
end
© Chef Software, Inc.
Licensed under the Creative Commons Attribution 3.0 Unported License.
The Chef™ Mark and Chef Logo are either registered trademarks/service marks or trademarks/servicemarks of Chef, in the United States and other countries and are used with Chef Inc's permission.
We are not affiliated with, endorsed or sponsored by Chef Inc.
https://docs.chef.io/inspec/resources/file/