Spec-Zone.ru › Chef 16

Ресурс файла

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

Используйте ресурс аудита 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 произвольные и зависят от типа проверяемого файла и от ожидаемого типа информации в файле:

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 проверяет, соответствует ли версия файла Windows заданному значению. Разница между «версией файла» и «версией продукта» заключается в том, что версия файла — это номер версии самого файла, а версия продукта — это номер версии приложения, из которого происходит этот файл:

its('file_version') { should eq '1.2.3' }

группа

Свойство group проверяет, соответствует ли группа, к которой принадлежит файл, указанному значению.

its('group') { should eq 'admins' }

Следующие примеры показывают, как использовать этот ресурс аудита Chef InSpec.

путь_к_ссылке

Свойство link_path проверяет, существует ли файл по указанному пути. Если файл является символической ссылкой, Chef InSpec рекурсивно разрешит символическую ссылку и вернет конечный связанный файл.

its('link_path') { should eq '/some/path/to/file' }

путь_неглубокой_ссылки

Свойство shallow_link_path возвращает путь, к которому ссылается файл, разрешая его только один раз (то есть выполняется операция readlink). Если файл не является символической ссылкой, возвращается nil.

its('shallow_link_path') { should eq '/some/path/to/file' }

md5sum

Свойство md5sum проверяет, соответствует ли контрольная сумма MD5 файла указанному значению.

its('md5sum') { should eq '3329x3hf9130gjs9jlasf2305mx91s4j' }

режим

Свойство 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 проверяет, соответствует ли владелец файла указанному значению.

its('owner') { should eq 'root' }

версия_продукта

Свойство product_version проверяет, соответствует ли версия продукта файла Windows указанному значению. Разница между «версией файла» и «версией продукта» заключается в том, что версия файла — это номер версии самого файла, а версия продукта — это номер версии приложения, из которого происходит этот файл:

its('product_version') { should eq '2.3.4' }

метка_selinux

Свойство 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 проверяет, соответствует ли размер файла, больше или меньше указанного значения. Например, равен:

its('size') { should eq 32375 }

Больше чем:

its('size') { should > 64 }

Меньше чем:

its('size') { should < 10240 }

тип

Свойство 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 (.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