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使えやって話も…