Spec-Zone.ru › Chef 17

ресурс файла

[править на GitHub]

Используйте ресурс проверки file Chef InSpec, чтобы проверить все типы системных файлов, включая файлы, каталоги, символические ссылки, именованные каналы, сокеты, символьные устройства, блочные устройства и двери.

Доступность

Установка

Этот ресурс распространяется вместе с самим Chef InSpec. Вы можете использовать его автоматически.

Версия

Этот ресурс стал доступен в версии v1.0.0 InSpec.

Синтаксис

Блок ресурса file объявляет расположение типа файла, который необходимо проверить, ожидаемый тип файла (если требуется) и одно (или несколько) свойств ресурса.

describe file('path') do
  it { should PROPERTY 'value' }
end

где

  • ('path') — имя файла и/или путь к файлу.
  • PROPERTY — допустимое свойство ресурса для этого ресурса.
  • 'value' — значение, которое нужно проверить.

Свойства

Общие свойства

  • content
  • size
  • basename
  • path
  • owner
  • group
  • type

Свойства Unix/Linux

  • symlink
  • mode
  • link_path
  • shallow_link_path
  • mtime
  • size
  • selinux_label
  • md5sum
  • sha256sum
  • path
  • source
  • source_path
  • uid
  • gid

Свойства Windows

  • file_version
  • product_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

&mldr; вы можете написать правила как для ссылки, так и для целевого файла.

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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API