serverspec of selinux

ハマったのでメモ。OSはCentOS6.5

基本的には公式にある通り

describe selinux do
  it { should be_permissive }
end

のように書けば良いはずだが、失敗(当然サーバー側はpermissiveとなっている状態で)

  1) selinux SELinux should be permissive
     On host `vagrant`
     Failure/Error: it { should be_permissive }
       sudo env PATH=/sbin:$PATH getenforce | grep -i -- permissive && sudo env PATH=/sbin:$PATH grep -i -- ^SELINUX=permissive$ /etc/selinux/config
       env: getenforce: No such file or directory

       expected permissive? to return true, got false
     # ./spec/ftp-centos6/selinux_spec.rb:5:in `block (3 levels) in <top (required)>'

env: getenforce: No such file or directoryが怪しい

どうやら、コマンド的には

$ sudo env PATH=/sbin:$PATH getenforce | grep -i -- permissive && sudo env PATH=/sbin:$PATH grep -i -- ^SELINUX=permissive$ /etc/selinux/config

が実行されている

直接サーバーでこれを実行してみると…成功

クライアントから実行してみると…やはり失敗

$ ssh vagrant@vagrant 'sudo env PATH=/sbin:$PATH getenforce | grep -i -- permissive && sudo env PATH=/sbin:$PATH grep -i -- ^SELINUX=permissive$ /etc/selinux/config'
env: getenforce: そのようなファイルやディレクトリはありません 

getenforceコマンドのpathは

[vagrant@localhost ~]$ which getenforce
/usr/sbin/getenforce

ん?serverspecではPATH=/sbin:$PATH getenforceとして実行している。pathが違う

pathを正しいものに帰ると…成功

$ ssh vagrant@vagrant 'sudo env PATH=/usr/sbin:$PATH getenforce | grep -i -- permissive && sudo env PATH=/sbin:$PATH grep -i -- ^SELINUX=permissive$ /etc/selinux/config'
Permissive
SELINUX=permissive 

spec_helper .rbにて/usr/sbinへのpathを通してあげれば解決しそう。ここを見て追記

c.path = '/usr/sbin' と追記

解決した


おまけ

CentOS5.2にも同じテストを実行したところ、失敗

サーバーにログインしてみるとそもそもgetenforceコマンドが無かった!

sestatusコマンドならあったので、以下のようにテストを別途作成した

describe command '/usr/sbin/sestatus' do
  it { should return_stdout %r(^SELinux\s+status:\s+permissive$) }
end

というかちゃんとselinux使えやって話も…