chef 17.10.163 → 18.0.169
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +19 -20
- data/README.md +7 -7
- data/Rakefile +3 -22
- data/{chef-universal-mingw32.gemspec → chef-universal-mingw-ucrt.gemspec} +8 -7
- data/chef.gemspec +17 -15
- data/lib/chef/api_client_v1.rb +9 -1
- data/lib/chef/application/exit_code.rb +3 -3
- data/lib/chef/client.rb +182 -0
- data/lib/chef/compliance/input.rb +1 -1
- data/lib/chef/compliance/profile.rb +1 -1
- data/lib/chef/compliance/profile_collection.rb +0 -1
- data/lib/chef/compliance/waiver.rb +1 -1
- data/lib/chef/cookbook/syntax_check.rb +2 -2
- data/lib/chef/dsl/reader_helpers.rb +1 -1
- data/lib/chef/dsl/rest_resource.rb +77 -0
- data/lib/chef/event_dispatch/base.rb +3 -0
- data/lib/chef/exceptions.rb +8 -0
- data/lib/chef/http/authenticator.rb +170 -3
- data/lib/chef/http/ssl_policies.rb +4 -4
- data/lib/chef/mixin/checksum.rb +0 -6
- data/lib/chef/mixin/homebrew_user.rb +5 -15
- data/lib/chef/mixin/openssl_helper.rb +13 -17
- data/lib/chef/mixin/powershell_exec.rb +5 -28
- data/lib/chef/node/mixin/immutablize_array.rb +1 -0
- data/lib/chef/property.rb +5 -3
- data/lib/chef/provider/cron.rb +1 -5
- data/lib/chef/provider/file.rb +2 -2
- data/lib/chef/provider/group/windows.rb +1 -1
- data/lib/chef/provider/http_request.rb +11 -9
- data/lib/chef/provider/mount/linux.rb +5 -0
- data/lib/chef/provider/mount/mount.rb +8 -0
- data/lib/chef/provider/mount/windows.rb +1 -1
- data/lib/chef/provider/package/chocolatey.rb +1 -14
- data/lib/chef/provider/package/rubygems.rb +1 -1
- data/lib/chef/provider/package/windows/msi.rb +2 -2
- data/lib/chef/provider/package/windows/registry_uninstall_entry.rb +1 -1
- data/lib/chef/provider/package/windows.rb +1 -1
- data/lib/chef/provider/package/yum/yum_helper.py +14 -2
- data/lib/chef/provider/package/zypper/version.rb +60 -0
- data/lib/chef/provider/package/zypper.rb +47 -8
- data/lib/chef/provider/service/windows.rb +1 -1
- data/lib/chef/provider/user/aix.rb +5 -0
- data/lib/chef/provider/user/linux.rb +29 -0
- data/lib/chef/provider/user/mac.rb +1 -1
- data/lib/chef/provider/user.rb +46 -14
- data/lib/chef/provider.rb +1 -1
- data/lib/chef/recipe.rb +1 -1
- data/lib/chef/resource/_rest_resource.rb +389 -0
- data/lib/chef/resource/alternatives.rb +0 -1
- data/lib/chef/resource/apt_package.rb +0 -1
- data/lib/chef/resource/apt_preference.rb +0 -1
- data/lib/chef/resource/apt_repository.rb +0 -1
- data/lib/chef/resource/apt_update.rb +0 -1
- data/lib/chef/resource/archive_file.rb +0 -1
- data/lib/chef/resource/bash.rb +0 -1
- data/lib/chef/resource/batch.rb +0 -1
- data/lib/chef/resource/bff_package.rb +0 -1
- data/lib/chef/resource/breakpoint.rb +0 -1
- data/lib/chef/resource/build_essential.rb +0 -1
- data/lib/chef/resource/cab_package.rb +0 -1
- data/lib/chef/resource/chef_client_config.rb +14 -18
- data/lib/chef/resource/chef_client_cron.rb +1 -2
- data/lib/chef/resource/chef_client_launchd.rb +2 -2
- data/lib/chef/resource/chef_client_scheduled_task.rb +3 -3
- data/lib/chef/resource/chef_client_systemd_timer.rb +1 -2
- data/lib/chef/resource/chef_client_trusted_certificate.rb +0 -1
- data/lib/chef/resource/chef_gem.rb +0 -1
- data/lib/chef/resource/chef_handler.rb +0 -1
- data/lib/chef/resource/chef_sleep.rb +1 -3
- data/lib/chef/resource/chef_vault_secret.rb +0 -1
- data/lib/chef/resource/chocolatey_config.rb +0 -1
- data/lib/chef/resource/chocolatey_feature.rb +0 -1
- data/lib/chef/resource/chocolatey_package.rb +0 -1
- data/lib/chef/resource/chocolatey_source.rb +0 -1
- data/lib/chef/resource/cookbook_file.rb +0 -1
- data/lib/chef/resource/cron/_cron_shared.rb +0 -1
- data/lib/chef/resource/cron/cron.rb +0 -1
- data/lib/chef/resource/cron/cron_d.rb +15 -1
- data/lib/chef/resource/cron_access.rb +0 -1
- data/lib/chef/resource/csh.rb +0 -1
- data/lib/chef/resource/directory.rb +0 -1
- data/lib/chef/resource/dmg_package.rb +0 -1
- data/lib/chef/resource/dnf_package.rb +0 -1
- data/lib/chef/resource/dpkg_package.rb +0 -1
- data/lib/chef/resource/dsc_resource.rb +0 -1
- data/lib/chef/resource/dsc_script.rb +0 -1
- data/lib/chef/resource/execute.rb +0 -1
- data/lib/chef/resource/file.rb +0 -1
- data/lib/chef/resource/freebsd_package.rb +0 -1
- data/lib/chef/resource/gem_package.rb +0 -1
- data/lib/chef/resource/group.rb +25 -2
- data/lib/chef/resource/habitat/habitat_package.rb +0 -1
- data/lib/chef/resource/habitat/habitat_sup.rb +6 -7
- data/lib/chef/resource/habitat/habitat_sup_windows.rb +1 -1
- data/lib/chef/resource/habitat_config.rb +0 -1
- data/lib/chef/resource/habitat_install.rb +0 -1
- data/lib/chef/resource/habitat_service.rb +0 -1
- data/lib/chef/resource/habitat_user_toml.rb +0 -1
- data/lib/chef/resource/homebrew_cask.rb +8 -8
- data/lib/chef/resource/homebrew_package.rb +1 -2
- data/lib/chef/resource/homebrew_tap.rb +5 -6
- data/lib/chef/resource/homebrew_update.rb +0 -2
- data/lib/chef/resource/hostname.rb +0 -1
- data/lib/chef/resource/http_request.rb +0 -1
- data/lib/chef/resource/ifconfig.rb +0 -1
- data/lib/chef/resource/inspec_input.rb +0 -1
- data/lib/chef/resource/inspec_waiver.rb +0 -1
- data/lib/chef/resource/inspec_waiver_file_entry.rb +2 -3
- data/lib/chef/resource/ips_package.rb +0 -1
- data/lib/chef/resource/kernel_module.rb +0 -1
- data/lib/chef/resource/ksh.rb +0 -1
- data/lib/chef/resource/launchd.rb +0 -1
- data/lib/chef/resource/link.rb +0 -1
- data/lib/chef/resource/locale.rb +2 -6
- data/lib/chef/resource/log.rb +0 -1
- data/lib/chef/resource/lwrp_base.rb +0 -4
- data/lib/chef/resource/macos_userdefaults.rb +5 -10
- data/lib/chef/resource/macosx_service.rb +0 -1
- data/lib/chef/resource/macports_package.rb +0 -1
- data/lib/chef/resource/mdadm.rb +0 -1
- data/lib/chef/resource/mount.rb +0 -1
- data/lib/chef/resource/msu_package.rb +0 -1
- data/lib/chef/resource/notify_group.rb +0 -2
- data/lib/chef/resource/ohai.rb +0 -1
- data/lib/chef/resource/ohai_hint.rb +0 -1
- data/lib/chef/resource/openbsd_package.rb +0 -1
- data/lib/chef/resource/openssl_dhparam.rb +0 -2
- data/lib/chef/resource/openssl_ec_private_key.rb +0 -2
- data/lib/chef/resource/openssl_ec_public_key.rb +0 -2
- data/lib/chef/resource/openssl_rsa_private_key.rb +0 -2
- data/lib/chef/resource/openssl_rsa_public_key.rb +0 -2
- data/lib/chef/resource/openssl_x509_certificate.rb +0 -2
- data/lib/chef/resource/openssl_x509_crl.rb +0 -2
- data/lib/chef/resource/openssl_x509_request.rb +0 -2
- data/lib/chef/resource/osx_profile.rb +0 -1
- data/lib/chef/resource/package.rb +0 -1
- data/lib/chef/resource/pacman_package.rb +0 -1
- data/lib/chef/resource/paludis_package.rb +0 -1
- data/lib/chef/resource/perl.rb +0 -1
- data/lib/chef/resource/plist.rb +7 -3
- data/lib/chef/resource/portage_package.rb +0 -1
- data/lib/chef/resource/powershell_package.rb +0 -1
- data/lib/chef/resource/powershell_package_source.rb +0 -1
- data/lib/chef/resource/powershell_script.rb +0 -1
- data/lib/chef/resource/python.rb +0 -1
- data/lib/chef/resource/reboot.rb +0 -1
- data/lib/chef/resource/registry_key.rb +0 -1
- data/lib/chef/resource/remote_directory.rb +0 -1
- data/lib/chef/resource/remote_file.rb +0 -1
- data/lib/chef/resource/rhsm_errata.rb +0 -1
- data/lib/chef/resource/rhsm_errata_level.rb +0 -1
- data/lib/chef/resource/rhsm_register.rb +0 -3
- data/lib/chef/resource/rhsm_repo.rb +0 -1
- data/lib/chef/resource/rhsm_subscription.rb +0 -1
- data/lib/chef/resource/route.rb +0 -1
- data/lib/chef/resource/rpm_package.rb +0 -1
- data/lib/chef/resource/ruby.rb +0 -1
- data/lib/chef/resource/ruby_block.rb +0 -1
- data/lib/chef/resource/scm/_scm.rb +0 -2
- data/lib/chef/resource/scm/git.rb +0 -2
- data/lib/chef/resource/scm/subversion.rb +0 -2
- data/lib/chef/resource/script.rb +0 -1
- data/lib/chef/resource/selinux/common_helpers.rb +47 -0
- data/lib/chef/resource/selinux/selinux_debian.erb +18 -0
- data/lib/chef/resource/selinux/selinux_default.erb +15 -0
- data/lib/chef/resource/selinux_boolean.rb +101 -0
- data/lib/chef/resource/selinux_fcontext.rb +160 -0
- data/lib/chef/resource/selinux_install.rb +107 -0
- data/lib/chef/resource/selinux_module.rb +143 -0
- data/lib/chef/resource/selinux_permissive.rb +64 -0
- data/lib/chef/resource/selinux_port.rb +118 -0
- data/lib/chef/resource/selinux_state.rb +166 -0
- data/lib/chef/resource/service.rb +0 -1
- data/lib/chef/resource/smartos_package.rb +0 -1
- data/lib/chef/resource/snap_package.rb +0 -1
- data/lib/chef/resource/solaris_package.rb +0 -1
- data/lib/chef/resource/ssh_known_hosts_entry.rb +0 -1
- data/lib/chef/resource/sudo.rb +0 -1
- data/lib/chef/resource/support/client.erb +5 -6
- data/lib/chef/resource/swap_file.rb +0 -1
- data/lib/chef/resource/sysctl.rb +1 -2
- data/lib/chef/resource/systemd_unit.rb +0 -1
- data/lib/chef/resource/template.rb +0 -1
- data/lib/chef/resource/timezone.rb +0 -1
- data/lib/chef/resource/user/aix_user.rb +0 -1
- data/lib/chef/resource/user/linux_user.rb +0 -1
- data/lib/chef/resource/user/mac_user.rb +0 -1
- data/lib/chef/resource/user/pw_user.rb +0 -1
- data/lib/chef/resource/user/solaris_user.rb +0 -1
- data/lib/chef/resource/user/windows_user.rb +0 -1
- data/lib/chef/resource/user.rb +10 -1
- data/lib/chef/resource/user_ulimit.rb +0 -1
- data/lib/chef/resource/whyrun_safe_ruby_block.rb +0 -1
- data/lib/chef/resource/windows_ad_join.rb +0 -2
- data/lib/chef/resource/windows_audit_policy.rb +0 -2
- data/lib/chef/resource/windows_auto_run.rb +0 -1
- data/lib/chef/resource/windows_defender.rb +0 -1
- data/lib/chef/resource/windows_defender_exclusion.rb +0 -1
- data/lib/chef/resource/windows_dfs_folder.rb +0 -1
- data/lib/chef/resource/windows_dfs_namespace.rb +0 -1
- data/lib/chef/resource/windows_dfs_server.rb +0 -1
- data/lib/chef/resource/windows_dns_record.rb +0 -1
- data/lib/chef/resource/windows_dns_zone.rb +0 -1
- data/lib/chef/resource/windows_env.rb +0 -1
- data/lib/chef/resource/windows_feature.rb +0 -1
- data/lib/chef/resource/windows_feature_dism.rb +0 -1
- data/lib/chef/resource/windows_feature_powershell.rb +0 -1
- data/lib/chef/resource/windows_firewall_profile.rb +0 -2
- data/lib/chef/resource/windows_firewall_rule.rb +0 -1
- data/lib/chef/resource/windows_font.rb +2 -3
- data/lib/chef/resource/windows_package.rb +0 -1
- data/lib/chef/resource/windows_pagefile.rb +0 -2
- data/lib/chef/resource/windows_path.rb +0 -1
- data/lib/chef/resource/windows_printer.rb +0 -1
- data/lib/chef/resource/windows_printer_port.rb +0 -1
- data/lib/chef/resource/windows_script.rb +0 -2
- data/lib/chef/resource/windows_security_policy.rb +0 -1
- data/lib/chef/resource/windows_service.rb +0 -1
- data/lib/chef/resource/windows_share.rb +0 -1
- data/lib/chef/resource/windows_shortcut.rb +1 -2
- data/lib/chef/resource/windows_task.rb +0 -1
- data/lib/chef/resource/windows_uac.rb +0 -1
- data/lib/chef/resource/windows_update_settings.rb +0 -1
- data/lib/chef/resource/windows_user_privilege.rb +0 -1
- data/lib/chef/resource/windows_workgroup.rb +0 -1
- data/lib/chef/resource/yum_package.rb +0 -1
- data/lib/chef/resource/yum_repository.rb +0 -1
- data/lib/chef/resource/zypper_package.rb +0 -1
- data/lib/chef/resource/zypper_repository.rb +0 -1
- data/lib/chef/resource.rb +12 -5
- data/lib/chef/resources.rb +7 -0
- data/lib/chef/run_context.rb +3 -3
- data/lib/chef/secret_fetcher/azure_key_vault.rb +1 -1
- data/lib/chef/version.rb +1 -1
- data/lib/chef/win32/handle.rb +6 -7
- data/lib/chef/win32/registry.rb +7 -3
- data/spec/data/rubygems.org/sexp_processor-info +2 -1
- data/spec/data/trusted_certs/example.crt +20 -29
- data/spec/data/trusted_certs/example_no_cn.crt +34 -30
- data/spec/data/trusted_certs/opscode.pem +54 -33
- data/spec/functional/resource/chocolatey_package_spec.rb +20 -32
- data/spec/functional/resource/dsc_script_spec.rb +1 -1
- data/spec/functional/resource/group_spec.rb +26 -42
- data/spec/functional/resource/link_spec.rb +8 -8
- data/spec/functional/resource/macos_userdefaults_spec.rb +4 -4
- data/spec/functional/resource/plist_spec.rb +25 -0
- data/spec/functional/resource/user/linux_user_spec.rb +127 -0
- data/spec/functional/resource/windows_certificate_spec.rb +1 -26
- data/spec/functional/resource/windows_font_spec.rb +12 -9
- data/spec/functional/resource/yum_package_spec.rb +1 -17
- data/spec/functional/resource/zypper_package_spec.rb +12 -10
- data/spec/functional/shell_spec.rb +1 -2
- data/spec/functional/version_spec.rb +1 -1
- data/spec/functional/win32/registry_spec.rb +0 -3
- data/spec/integration/client/client_spec.rb +82 -3
- data/spec/integration/client/exit_code_spec.rb +1 -1
- data/spec/integration/client/ipv6_spec.rb +1 -1
- data/spec/integration/compliance/compliance_spec.rb +1 -1
- data/spec/integration/recipes/accumulator_spec.rb +1 -1
- data/spec/integration/recipes/lwrp_inline_resources_spec.rb +1 -1
- data/spec/integration/recipes/lwrp_spec.rb +1 -1
- data/spec/integration/recipes/notifies_spec.rb +1 -1
- data/spec/integration/recipes/notifying_block_spec.rb +1 -1
- data/spec/integration/recipes/remote_directory.rb +1 -1
- data/spec/integration/recipes/unified_mode_spec.rb +1 -1
- data/spec/integration/recipes/use_partial_spec.rb +2 -1
- data/spec/integration/solo/solo_spec.rb +2 -2
- data/spec/spec_helper.rb +1 -5
- data/spec/support/platform_helpers.rb +0 -4
- data/spec/support/ruby_installer.rb +1 -1
- data/spec/support/shared/functional/windows_script.rb +2 -2
- data/spec/unit/application/client_spec.rb +0 -10
- data/spec/unit/client_spec.rb +70 -2
- data/spec/unit/compliance/reporter/chef_server_automate_spec.rb +1 -1
- data/spec/unit/cookbook/syntax_check_spec.rb +3 -0
- data/spec/unit/http/authenticator_spec.rb +68 -0
- data/spec/unit/mixin/checksum_spec.rb +0 -28
- data/spec/unit/mixin/homebrew_user_spec.rb +7 -30
- data/spec/unit/mixin/openssl_helper_spec.rb +1 -1
- data/spec/unit/mixin/powershell_exec_spec.rb +5 -5
- data/spec/unit/platform/query_helpers_spec.rb +2 -17
- data/spec/unit/provider/cron_spec.rb +0 -34
- data/spec/unit/provider/http_request_spec.rb +60 -72
- data/spec/unit/provider/mount/linux_spec.rb +10 -0
- data/spec/unit/provider/package/chocolatey_spec.rb +3 -20
- data/spec/unit/provider/package/rubygems_spec.rb +1 -1
- data/spec/unit/provider/package/zypper_spec.rb +32 -0
- data/spec/unit/provider/user/linux_spec.rb +51 -11
- data/spec/unit/provider/user_spec.rb +24 -6
- data/spec/unit/resource/archive_file_spec.rb +1 -1
- data/spec/unit/resource/chef_client_cron_spec.rb +5 -0
- data/spec/unit/resource/chef_client_launchd_spec.rb +5 -0
- data/spec/unit/resource/chef_client_scheduled_task_spec.rb +5 -0
- data/spec/unit/resource/chef_client_systemd_timer_spec.rb +2 -2
- data/spec/unit/resource/cron_d_spec.rb +37 -1
- data/spec/unit/resource/macos_user_defaults_spec.rb +4 -4
- data/spec/unit/resource/rest_resource_spec.rb +381 -0
- data/spec/unit/resource/selinux_boolean_spec.rb +92 -0
- data/spec/unit/resource/selinux_fcontext_spec.rb +65 -0
- data/spec/unit/resource/selinux_install_spec.rb +60 -0
- data/spec/unit/resource/selinux_module_spec.rb +55 -0
- data/spec/unit/resource/selinux_permissive_spec.rb +39 -0
- data/spec/unit/resource/selinux_port_spec.rb +42 -0
- data/spec/unit/resource/selinux_state_spec.rb +46 -0
- data/spec/unit/resource/sysctl_spec.rb +2 -2
- data/spec/unit/resource/user/linux_user_spec.rb +42 -0
- data/spec/unit/resource_spec.rb +8 -2
- data/spec/unit/util/dsc/local_configuration_manager_spec.rb +1 -1
- data/tasks/rspec.rb +1 -1
- metadata +106 -55
- data/spec/functional/assets/yumrepo-empty/repodata/01a3b-filelists.sqlite.bz2 +0 -0
- data/spec/functional/assets/yumrepo-empty/repodata/401dc-filelists.xml.gz +0 -0
- data/spec/functional/assets/yumrepo-empty/repodata/5dc1e-primary.sqlite.bz2 +0 -0
- data/spec/functional/assets/yumrepo-empty/repodata/6bf96-other.xml.gz +0 -0
- data/spec/functional/assets/yumrepo-empty/repodata/7c365-other.sqlite.bz2 +0 -0
- data/spec/functional/assets/yumrepo-empty/repodata/dabe2-primary.xml.gz +0 -0
- data/spec/functional/assets/yumrepo-empty/repodata/repomd.xml +0 -55
- data/spec/integration/client/fips_spec.rb +0 -29
- data/spec/integration/client/open_ssl_spec.rb +0 -20
- /data/spec/functional/assets/chocolatey_feed/{test-A.1.0.0.nupkg → test-A.1.0.nupkg} +0 -0
- /data/spec/functional/assets/chocolatey_feed/{test-A.1.5.0.nupkg → test-A.1.5.nupkg} +0 -0
- /data/spec/functional/assets/chocolatey_feed/{test-A.2.0.0.nupkg → test-A.2.0.nupkg} +0 -0
- /data/spec/functional/assets/chocolatey_feed/{test-B.1.0.0.nupkg → test-B.1.0.nupkg} +0 -0
- /data/spec/functional/assets/yumrepo/repodata/{01a3b-filelists.sqlite.bz2 → 4632d67cb92636e7575d911c24f0e04d3505a944e97c483abe0c3e73a7c62d33-filelists.sqlite.bz2} +0 -0
- /data/spec/functional/assets/yumrepo/repodata/{6bf96-other.xml.gz → 74599b793e54d877323837d2d81a1c3c594c44e4335f9528234bb490f7b9b439-other.xml.gz} +0 -0
- /data/spec/functional/assets/yumrepo/repodata/{5dc1e-primary.sqlite.bz2 → a845d418f919d2115ab95a56b2c76f6825ad0d0bede49181a55c04f58995d057-primary.sqlite.bz2} +0 -0
- /data/spec/functional/assets/yumrepo/repodata/{7c365-other.sqlite.bz2 → af9b7cf9ef23bd7b43068d74a460f3b5d06753d638e58e4a0c9edc35bfb9cdc4-other.sqlite.bz2} +0 -0
- /data/spec/functional/assets/yumrepo/repodata/{401dc-filelists.xml.gz → bdb4f5f1492a3b9532f22c43110a81500dd744f23da0aec5c33b2a41317c737d-filelists.xml.gz} +0 -0
- /data/spec/functional/assets/yumrepo/repodata/{dabe2-primary.xml.gz → c10d1d34ce99e02f12ec96ef68360543ab1bb7c3cb81a4a2bf78df7d8597e9df-primary.xml.gz} +0 -0
@@ -0,0 +1,101 @@
|
|
1
|
+
#
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
3
|
+
# you may not use this file except in compliance with the License.
|
4
|
+
# You may obtain a copy of the License at
|
5
|
+
#
|
6
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
7
|
+
#
|
8
|
+
# Unless required by applicable law or agreed to in writing, software
|
9
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
10
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
11
|
+
# See the License for the specific language governing permissions and
|
12
|
+
# limitations under the License.
|
13
|
+
#
|
14
|
+
|
15
|
+
require_relative "../resource"
|
16
|
+
require_relative "selinux/common_helpers"
|
17
|
+
|
18
|
+
class Chef
|
19
|
+
class Resource
|
20
|
+
class SelinuxBoolean < Chef::Resource
|
21
|
+
unified_mode true
|
22
|
+
|
23
|
+
provides :selinux_boolean
|
24
|
+
|
25
|
+
description "Use **selinux_boolean** resource to set SELinux boolean values."
|
26
|
+
introduced "18.0"
|
27
|
+
examples <<~DOC
|
28
|
+
**Set ssh_keysign to true**:
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
selinux_boolean 'ssh_keysign' do
|
32
|
+
value true
|
33
|
+
end
|
34
|
+
```
|
35
|
+
|
36
|
+
**Set ssh_sysadm_login to 'on'**:
|
37
|
+
|
38
|
+
```ruby
|
39
|
+
selinux_boolean 'ssh_sysadm_login' do
|
40
|
+
value 'on'
|
41
|
+
end
|
42
|
+
```
|
43
|
+
DOC
|
44
|
+
|
45
|
+
property :boolean, String,
|
46
|
+
name_property: true,
|
47
|
+
description: "SELinux boolean to set."
|
48
|
+
|
49
|
+
property :value, [Integer, String, true, false],
|
50
|
+
required: true,
|
51
|
+
equal_to: %w{on off},
|
52
|
+
coerce: proc { |p| selinux_bool(p) },
|
53
|
+
description: "SELinux boolean value."
|
54
|
+
|
55
|
+
property :persistent, [true, false],
|
56
|
+
default: true,
|
57
|
+
desired_state: false,
|
58
|
+
description: "Set to true for value setting to survive reboot."
|
59
|
+
|
60
|
+
load_current_value do |new_resource|
|
61
|
+
value shell_out!("getsebool", new_resource.boolean).stdout.split("-->").map(&:strip).last
|
62
|
+
end
|
63
|
+
|
64
|
+
action_class do
|
65
|
+
include Chef::SELinux::CommonHelpers
|
66
|
+
end
|
67
|
+
|
68
|
+
action :set , description: "Set the state of the boolean." do
|
69
|
+
if selinux_disabled?
|
70
|
+
Chef::Log.warn("Unable to set SELinux boolean #{new_resource.name} as SELinux is disabled")
|
71
|
+
return
|
72
|
+
end
|
73
|
+
|
74
|
+
converge_if_changed do
|
75
|
+
cmd = "setsebool"
|
76
|
+
cmd += " -P" if new_resource.persistent
|
77
|
+
cmd += " #{new_resource.boolean} #{new_resource.value}"
|
78
|
+
|
79
|
+
shell_out!(cmd)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
private
|
84
|
+
|
85
|
+
#
|
86
|
+
# Validate and return input boolean value in required format
|
87
|
+
# @param bool [String, Integer, Boolean] Input boolean value in allowed formats
|
88
|
+
#
|
89
|
+
# @return [String] [description] Boolean value in required format
|
90
|
+
def selinux_bool(bool)
|
91
|
+
if ["on", "true", "1", true, 1].include?(bool)
|
92
|
+
"on"
|
93
|
+
elsif ["off", "false", "0", false, 0].include?(bool)
|
94
|
+
"off"
|
95
|
+
else
|
96
|
+
raise ArgumentError, "selinux_bool: Invalid selinux boolean value #{bool}"
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,160 @@
|
|
1
|
+
#
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
3
|
+
# you may not use this file except in compliance with the License.
|
4
|
+
# You may obtain a copy of the License at
|
5
|
+
#
|
6
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
7
|
+
#
|
8
|
+
# Unless required by applicable law or agreed to in writing, software
|
9
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
10
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
11
|
+
# See the License for the specific language governing permissions and
|
12
|
+
# limitations under the License.
|
13
|
+
#
|
14
|
+
|
15
|
+
require_relative "../resource"
|
16
|
+
require_relative "selinux/common_helpers"
|
17
|
+
|
18
|
+
class Chef
|
19
|
+
class Resource
|
20
|
+
class SelinuxFcontext < Chef::Resource
|
21
|
+
unified_mode true
|
22
|
+
|
23
|
+
provides :selinux_fcontext
|
24
|
+
|
25
|
+
description "Use **selinux_fcontext** resource to set the SELinux context of files with semanage fcontext."
|
26
|
+
introduced "18.0"
|
27
|
+
examples <<~DOC
|
28
|
+
**Allow http servers (e.g. nginx/apache) to modify moodle files**:
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
selinux_fcontext '/var/www/moodle(/.*)?' do
|
32
|
+
secontext 'httpd_sys_rw_content_t'
|
33
|
+
end
|
34
|
+
```
|
35
|
+
|
36
|
+
**Adapt a symbolic link**:
|
37
|
+
|
38
|
+
```ruby
|
39
|
+
selinux_fcontext '/var/www/symlink_to_webroot' do
|
40
|
+
secontext 'httpd_sys_rw_content_t'
|
41
|
+
file_type 'l'
|
42
|
+
end
|
43
|
+
```
|
44
|
+
DOC
|
45
|
+
|
46
|
+
property :file_spec, String,
|
47
|
+
name_property: true,
|
48
|
+
description: "Path to or regex matching the files or directories to label."
|
49
|
+
|
50
|
+
property :secontext, String,
|
51
|
+
required: %i{add modify manage},
|
52
|
+
description: "SELinux context to assign."
|
53
|
+
|
54
|
+
property :file_type, String,
|
55
|
+
default: "a",
|
56
|
+
equal_to: %w{a f d c b s l p},
|
57
|
+
description: "The type of the file being labeled."
|
58
|
+
|
59
|
+
action_class do
|
60
|
+
include Chef::SELinux::CommonHelpers
|
61
|
+
def current_file_context
|
62
|
+
file_hash = {
|
63
|
+
"a" => "all files",
|
64
|
+
"f" => "regular file",
|
65
|
+
"d" => "directory",
|
66
|
+
"c" => "character device",
|
67
|
+
"b" => "block device",
|
68
|
+
"s" => "socket",
|
69
|
+
"l" => "symbolic link",
|
70
|
+
"p" => "named pipe",
|
71
|
+
}
|
72
|
+
|
73
|
+
contexts = shell_out!("semanage fcontext -l").stdout.split("\n")
|
74
|
+
# pull out file label from user:role:type:level context string
|
75
|
+
contexts.grep(/^#{Regexp.escape(new_resource.file_spec)}\s+#{file_hash[new_resource.file_type]}/) do |c|
|
76
|
+
c.match(/.+ (?<user>.+):(?<role>.+):(?<type>.+):(?<level>.+)$/)[:type]
|
77
|
+
# match returns ['foo'] or [], shift converts that to 'foo' or nil
|
78
|
+
end.shift
|
79
|
+
end
|
80
|
+
|
81
|
+
# Run restorecon to fix label
|
82
|
+
# https://github.com/sous-chefs/selinux_policy/pull/72#issuecomment-338718721
|
83
|
+
def relabel_files
|
84
|
+
spec = new_resource.file_spec
|
85
|
+
escaped = Regexp.escape spec
|
86
|
+
|
87
|
+
# find common path between regex and string
|
88
|
+
common = if spec == escaped
|
89
|
+
spec
|
90
|
+
else
|
91
|
+
index = spec.size.times { |i| break i if spec[i] != escaped[i] }
|
92
|
+
::File.dirname spec[0...index]
|
93
|
+
end
|
94
|
+
|
95
|
+
# if path is not absolute, ignore it and search everything
|
96
|
+
common = "/" if common[0] != "/"
|
97
|
+
|
98
|
+
if ::File.exist? common
|
99
|
+
shell_out!("find #{common.shellescape} -ignore_readdir_race -regextype posix-egrep -regex #{spec.shellescape} -prune -print0 | xargs -0 restorecon -iRv")
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
action :manage, description: "Assign the file to the right context regardless of previous state." do
|
105
|
+
run_action(:add)
|
106
|
+
run_action(:modify)
|
107
|
+
end
|
108
|
+
|
109
|
+
action :addormodify, description: "Assign the file context if not set. Update the file context if previously set." do
|
110
|
+
Chef::Log.warn("The :addormodify action for selinux_fcontext is deprecated and will be removed in a future release. Use the :manage action instead.")
|
111
|
+
run_action(:manage)
|
112
|
+
end
|
113
|
+
|
114
|
+
# Create if doesn't exist, do not touch if fcontext is already registered
|
115
|
+
action :add, description: "Assign the file context if not set." do
|
116
|
+
if selinux_disabled?
|
117
|
+
Chef::Log.warn("Unable to add SELinux fcontext #{new_resource.name} as SELinux is disabled")
|
118
|
+
return
|
119
|
+
end
|
120
|
+
|
121
|
+
unless current_file_context
|
122
|
+
converge_by "adding label #{new_resource.secontext} to #{new_resource.file_spec}" do
|
123
|
+
shell_out!("semanage fcontext -a -f #{new_resource.file_type} -t #{new_resource.secontext} '#{new_resource.file_spec}'")
|
124
|
+
relabel_files
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
# Only modify if fcontext exists & doesn't have the correct label already
|
130
|
+
action :modify, description: "Update the file context if previously set." do
|
131
|
+
if selinux_disabled?
|
132
|
+
Chef::Log.warn("Unable to modify SELinux fcontext #{new_resource.name} as SELinux is disabled")
|
133
|
+
return
|
134
|
+
end
|
135
|
+
|
136
|
+
if current_file_context && current_file_context != new_resource.secontext
|
137
|
+
converge_by "modifying label #{new_resource.secontext} to #{new_resource.file_spec}" do
|
138
|
+
shell_out!("semanage fcontext -m -f #{new_resource.file_type} -t #{new_resource.secontext} '#{new_resource.file_spec}'")
|
139
|
+
relabel_files
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
# Delete if exists
|
145
|
+
action :delete, description: "Removes the file context if set. " do
|
146
|
+
if selinux_disabled?
|
147
|
+
Chef::Log.warn("Unable to delete SELinux fcontext #{new_resource.name} as SELinux is disabled")
|
148
|
+
return
|
149
|
+
end
|
150
|
+
|
151
|
+
if current_file_context
|
152
|
+
converge_by "deleting label for #{new_resource.file_spec}" do
|
153
|
+
shell_out!("semanage fcontext -d -f #{new_resource.file_type} '#{new_resource.file_spec}'")
|
154
|
+
relabel_files
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
#
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
3
|
+
# you may not use this file except in compliance with the License.
|
4
|
+
# You may obtain a copy of the License at
|
5
|
+
#
|
6
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
7
|
+
#
|
8
|
+
# Unless required by applicable law or agreed to in writing, software
|
9
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
10
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
11
|
+
# See the License for the specific language governing permissions and
|
12
|
+
# limitations under the License.
|
13
|
+
|
14
|
+
require_relative "../resource"
|
15
|
+
|
16
|
+
class Chef
|
17
|
+
class Resource
|
18
|
+
class SelinuxInstall < Chef::Resource
|
19
|
+
unified_mode true
|
20
|
+
|
21
|
+
provides :selinux_install
|
22
|
+
|
23
|
+
description "Use **selinux_install** resource to encapsulates the set of selinux packages to install in order to manage selinux. It also ensures the directory `/etc/selinux` is created."
|
24
|
+
introduced "18.0"
|
25
|
+
examples <<~DOC
|
26
|
+
**Default installation**:
|
27
|
+
|
28
|
+
```ruby
|
29
|
+
selinux_install 'example'
|
30
|
+
```
|
31
|
+
|
32
|
+
**Install with custom packages**:
|
33
|
+
|
34
|
+
```ruby
|
35
|
+
selinux_install 'example' do
|
36
|
+
packages %w(policycoreutils selinux-policy selinux-policy-targeted)
|
37
|
+
end
|
38
|
+
```
|
39
|
+
|
40
|
+
**Uninstall**
|
41
|
+
```ruby
|
42
|
+
selinux_install 'example' do
|
43
|
+
action :remove
|
44
|
+
end
|
45
|
+
```
|
46
|
+
DOC
|
47
|
+
|
48
|
+
property :packages, [String, Array],
|
49
|
+
default: lazy { default_install_packages },
|
50
|
+
description: "SELinux packages for system."
|
51
|
+
|
52
|
+
action_class do
|
53
|
+
def do_package_action(action)
|
54
|
+
# friendly message for unsupported platforms
|
55
|
+
raise "The platform #{node["platform"]} is not currently supported by the `selinux_install` resource. Please file an issue at https://github.com/chef/chef/issues with details on the platform this cookbook is running on." if new_resource.packages.nil?
|
56
|
+
|
57
|
+
package "selinux" do
|
58
|
+
package_name new_resource.packages
|
59
|
+
action action
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
action :install, description: "Install required packages." do
|
65
|
+
do_package_action(action)
|
66
|
+
|
67
|
+
directory "/etc/selinux" do
|
68
|
+
owner "root"
|
69
|
+
group "root"
|
70
|
+
mode "0755"
|
71
|
+
action :create
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
action :upgrade, description: "Upgrade required packages." do
|
76
|
+
do_package_action(a)
|
77
|
+
end
|
78
|
+
|
79
|
+
action :remove, description: "Remove any SELinux-related packages." do
|
80
|
+
do_package_action(a)
|
81
|
+
end
|
82
|
+
|
83
|
+
private
|
84
|
+
|
85
|
+
#
|
86
|
+
# Get an array of packages to be installed based upon node platform_family
|
87
|
+
#
|
88
|
+
# @return [Array] Array of string of package names
|
89
|
+
def default_install_packages
|
90
|
+
case node["platform_family"]
|
91
|
+
when "rhel", "fedora", "amazon"
|
92
|
+
%w{make policycoreutils selinux-policy selinux-policy-targeted selinux-policy-devel libselinux-utils setools-console}
|
93
|
+
when "debian"
|
94
|
+
if node["platform"] == "ubuntu"
|
95
|
+
if node["platform_version"].to_f == 18.04
|
96
|
+
%w{make policycoreutils selinux selinux-basics selinux-policy-default selinux-policy-dev auditd setools}
|
97
|
+
else
|
98
|
+
%w{make policycoreutils selinux-basics selinux-policy-default selinux-policy-dev auditd setools}
|
99
|
+
end
|
100
|
+
else
|
101
|
+
%w{make policycoreutils selinux-basics selinux-policy-default selinux-policy-dev auditd setools}
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,143 @@
|
|
1
|
+
#
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
3
|
+
# you may not use this file except in compliance with the License.
|
4
|
+
# You may obtain a copy of the License at
|
5
|
+
#
|
6
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
7
|
+
#
|
8
|
+
# Unless required by applicable law or agreed to in writing, software
|
9
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
10
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
11
|
+
# See the License for the specific language governing permissions and
|
12
|
+
# limitations under the License.
|
13
|
+
|
14
|
+
require_relative "../resource"
|
15
|
+
|
16
|
+
class Chef
|
17
|
+
class Resource
|
18
|
+
class SelinuxModule < Chef::Resource
|
19
|
+
unified_mode true
|
20
|
+
|
21
|
+
provides :selinux_module
|
22
|
+
|
23
|
+
description "Use **selinux_module** module resource to create an SELinux policy module from a cookbook file or content provided as a string."
|
24
|
+
introduced "18.0"
|
25
|
+
examples <<~DOC
|
26
|
+
**Creating SElinux module from .te file located at `files` directory of your cookbook.**:
|
27
|
+
|
28
|
+
```ruby
|
29
|
+
selinux_module 'my_policy_module' do
|
30
|
+
source 'my_policy_module.te'
|
31
|
+
action :create
|
32
|
+
end
|
33
|
+
```
|
34
|
+
DOC
|
35
|
+
|
36
|
+
property :module_name, String,
|
37
|
+
name_property: true,
|
38
|
+
description: "Override the module name."
|
39
|
+
|
40
|
+
property :source, String,
|
41
|
+
description: "Module source file name."
|
42
|
+
|
43
|
+
property :content, String,
|
44
|
+
description: "Module source as String."
|
45
|
+
|
46
|
+
property :cookbook, String,
|
47
|
+
description: "Cookbook to source from module source file from(if it is not located in the current cookbook). The default value is the current cookbook.",
|
48
|
+
desired_state: false
|
49
|
+
|
50
|
+
property :base_dir, String,
|
51
|
+
default: "/etc/selinux/local",
|
52
|
+
description: "Directory to create module source file in."
|
53
|
+
|
54
|
+
action_class do
|
55
|
+
def selinux_module_filepath(type)
|
56
|
+
path = ::File.join(new_resource.base_dir, "#{new_resource.module_name}")
|
57
|
+
path.concat(".#{type}") if type
|
58
|
+
end
|
59
|
+
|
60
|
+
def list_installed_modules
|
61
|
+
shell_out!("semodule --list-modules").stdout.split("\n").map { |x| x.split(/\s/).first }
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
action :create, description: "Compile a module and install it." do
|
66
|
+
directory new_resource.base_dir
|
67
|
+
|
68
|
+
if property_is_set?(:content)
|
69
|
+
file selinux_module_filepath("te") do
|
70
|
+
content new_resource.content
|
71
|
+
|
72
|
+
mode "0600"
|
73
|
+
owner "root"
|
74
|
+
group "root"
|
75
|
+
|
76
|
+
action :create
|
77
|
+
|
78
|
+
notifies :run, "execute[Compiling SELinux modules at '#{new_resource.base_dir}']", :immediately
|
79
|
+
end
|
80
|
+
else
|
81
|
+
cookbook_file selinux_module_filepath("te") do
|
82
|
+
cookbook new_resource.cookbook
|
83
|
+
source new_resource.source
|
84
|
+
|
85
|
+
mode "0600"
|
86
|
+
owner "root"
|
87
|
+
group "root"
|
88
|
+
|
89
|
+
action :create
|
90
|
+
|
91
|
+
notifies :run, "execute[Compiling SELinux modules at '#{new_resource.base_dir}']", :immediately
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
execute "Compiling SELinux modules at '#{new_resource.base_dir}'" do
|
96
|
+
cwd new_resource.base_dir
|
97
|
+
command "make -C #{new_resource.base_dir} -f /usr/share/selinux/devel/Makefile"
|
98
|
+
timeout 120
|
99
|
+
user "root"
|
100
|
+
|
101
|
+
action :nothing
|
102
|
+
|
103
|
+
notifies :run, "execute[Install SELinux module '#{selinux_module_filepath("pp")}']", :immediately
|
104
|
+
end
|
105
|
+
|
106
|
+
raise "Compilation must have failed, no 'pp' file found at: '#{selinux_module_filepath("pp")}'" unless ::File.exist?(selinux_module_filepath("pp"))
|
107
|
+
|
108
|
+
execute "Install SELinux module '#{selinux_module_filepath("pp")}'" do
|
109
|
+
command "semodule --install '#{selinux_module_filepath("pp")}'"
|
110
|
+
action :nothing
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
action :delete, description: "Remove module source files from `/etc/selinux/local`." do
|
115
|
+
%w{fc if pp te}.each do |type|
|
116
|
+
next unless ::File.exist?(selinux_module_filepath(type))
|
117
|
+
|
118
|
+
file selinux_module_filepath(type) do
|
119
|
+
action :delete
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
action :install, description: "Install a compiled module into the system." do
|
125
|
+
raise "Module must be compiled before it can be installed, no 'pp' file found at: '#{selinux_module_filepath("pp")}'" unless ::File.exist?(selinux_module_filepath("pp"))
|
126
|
+
|
127
|
+
unless list_installed_modules.include? new_resource.module_name
|
128
|
+
converge_by "Install SELinux module #{selinux_module_filepath("pp")}" do
|
129
|
+
shell_out!("semodule", "--install", selinux_module_filepath("pp"))
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
action :remove, description: "Remove a module from the system." do
|
135
|
+
if list_installed_modules.include? new_resource.module_name
|
136
|
+
converge_by "Remove SELinux module #{new_resource.module_name}" do
|
137
|
+
shell_out!("semodule", "--remove", new_resource.module_name)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
#
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
3
|
+
# you may not use this file except in compliance with the License.
|
4
|
+
# You may obtain a copy of the License at
|
5
|
+
#
|
6
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
7
|
+
#
|
8
|
+
# Unless required by applicable law or agreed to in writing, software
|
9
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
10
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
11
|
+
# See the License for the specific language governing permissions and
|
12
|
+
# limitations under the License.
|
13
|
+
|
14
|
+
require_relative "../resource"
|
15
|
+
|
16
|
+
class Chef
|
17
|
+
class Resource
|
18
|
+
class SelinuxPermissive < Chef::Resource
|
19
|
+
unified_mode true
|
20
|
+
|
21
|
+
provides :selinux_permissive
|
22
|
+
|
23
|
+
description "Use **selinux_permissive** resource to allows some types to misbehave without stopping them. Not as good as specific policies, but better than disabling SELinux entirely."
|
24
|
+
introduced "18.0"
|
25
|
+
examples <<~DOC
|
26
|
+
**Disable enforcement on Apache**:
|
27
|
+
|
28
|
+
```ruby
|
29
|
+
selinux_permissive 'httpd_t' do
|
30
|
+
notifies :restart, 'service[httpd]'
|
31
|
+
end
|
32
|
+
```
|
33
|
+
DOC
|
34
|
+
|
35
|
+
property :context, String,
|
36
|
+
name_property: true,
|
37
|
+
description: "The SELinux context to permit."
|
38
|
+
|
39
|
+
action_class do
|
40
|
+
def current_permissives
|
41
|
+
shell_out!("semanage permissive -ln").stdout.split("\n")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# Create if doesn't exist, do not touch if permissive is already registered (even under different type)
|
46
|
+
action :add, description: "Add a permissive, unless already set." do
|
47
|
+
unless current_permissives.include? new_resource.context
|
48
|
+
converge_by "adding permissive context #{new_resource.context}" do
|
49
|
+
shell_out!("semanage permissive -a '#{new_resource.context}'")
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Delete if exists
|
55
|
+
action :delete, description: "Remove a permissive, if set." do
|
56
|
+
if current_permissives.include? new_resource.context
|
57
|
+
converge_by "deleting permissive context #{new_resource.context}" do
|
58
|
+
shell_out!("semanage permissive -d '#{new_resource.context}'")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
#
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
3
|
+
# you may not use this file except in compliance with the License.
|
4
|
+
# You may obtain a copy of the License at
|
5
|
+
#
|
6
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
7
|
+
#
|
8
|
+
# Unless required by applicable law or agreed to in writing, software
|
9
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
10
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
11
|
+
# See the License for the specific language governing permissions and
|
12
|
+
# limitations under the License.
|
13
|
+
|
14
|
+
require_relative "../resource"
|
15
|
+
require_relative "selinux/common_helpers"
|
16
|
+
|
17
|
+
class Chef
|
18
|
+
class Resource
|
19
|
+
class SelinuxPort < Chef::Resource
|
20
|
+
unified_mode true
|
21
|
+
|
22
|
+
provides :selinux_port
|
23
|
+
|
24
|
+
description "Use **selinux_port** resource to allows assigning a network port to a certain SELinux context, e.g. for running a webserver on a non-standard port."
|
25
|
+
introduced "18.0"
|
26
|
+
examples <<~DOC
|
27
|
+
**Allow nginx/apache to bind to port 5678 by giving it the http_port_t context**:
|
28
|
+
|
29
|
+
```ruby
|
30
|
+
selinux_port '5678' do
|
31
|
+
protocol 'tcp'
|
32
|
+
secontext 'http_port_t'
|
33
|
+
end
|
34
|
+
```
|
35
|
+
DOC
|
36
|
+
|
37
|
+
property :port, [Integer, String],
|
38
|
+
name_property: true,
|
39
|
+
regex: /^\d+$/,
|
40
|
+
description: "Port to modify."
|
41
|
+
|
42
|
+
property :protocol, String,
|
43
|
+
equal_to: %w{tcp udp},
|
44
|
+
required: %i{manage add modify},
|
45
|
+
description: "Protocol to modify."
|
46
|
+
|
47
|
+
property :secontext, String,
|
48
|
+
required: %i{manage add modify},
|
49
|
+
description: "SELinux context to assign to the port."
|
50
|
+
|
51
|
+
action_class do
|
52
|
+
include Chef::SELinux::CommonHelpers
|
53
|
+
def current_port_context
|
54
|
+
# use awk to see if the given port is within a reported port range
|
55
|
+
shell_out!(
|
56
|
+
<<~CMD
|
57
|
+
seinfo --portcon=#{new_resource.port} | grep 'portcon #{new_resource.protocol}' | \
|
58
|
+
awk -F: '$(NF-1) !~ /reserved_port_t$/ && $(NF-3) !~ /[0-9]*-[0-9]*/ {print $(NF-1)}'
|
59
|
+
CMD
|
60
|
+
).stdout.split
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
action :manage, description: "Assign the port to the right context regardless of previous state." do
|
65
|
+
run_action(:add)
|
66
|
+
run_action(:modify)
|
67
|
+
end
|
68
|
+
|
69
|
+
action :addormodify, description: "Assigns the port context if not set. Updates the port context if previously set." do
|
70
|
+
Chef::Log.warn("The :addormodify action for selinux_port is deprecated and will be removed in a future release. Use the :manage action instead.")
|
71
|
+
run_action(:manage)
|
72
|
+
end
|
73
|
+
|
74
|
+
# Create if doesn't exist, do not touch if port is already registered (even under different type)
|
75
|
+
action :add, description: "Assign the port context if not set." do
|
76
|
+
if selinux_disabled?
|
77
|
+
Chef::Log.warn("Unable to add SELinux port #{new_resource.name} as SELinux is disabled")
|
78
|
+
return
|
79
|
+
end
|
80
|
+
|
81
|
+
if current_port_context.empty?
|
82
|
+
converge_by "Adding context #{new_resource.secontext} to port #{new_resource.port}/#{new_resource.protocol}" do
|
83
|
+
shell_out!("semanage port -a -t '#{new_resource.secontext}' -p #{new_resource.protocol} #{new_resource.port}")
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# Only modify port if it exists & doesn't have the correct context already
|
89
|
+
action :modify, description: "Update the port context if previously set." do
|
90
|
+
if selinux_disabled?
|
91
|
+
Chef::Log.warn("Unable to modify SELinux port #{new_resource.name} as SELinux is disabled")
|
92
|
+
return
|
93
|
+
end
|
94
|
+
|
95
|
+
if !current_port_context.empty? && !current_port_context.include?(new_resource.secontext)
|
96
|
+
converge_by "Modifying context #{new_resource.secontext} to port #{new_resource.port}/#{new_resource.protocol}" do
|
97
|
+
shell_out!("semanage port -m -t '#{new_resource.secontext}' -p #{new_resource.protocol} #{new_resource.port}")
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
# Delete if exists
|
103
|
+
action :delete, description: "Removes the port context if set." do
|
104
|
+
if selinux_disabled?
|
105
|
+
Chef::Log.warn("Unable to delete SELinux port #{new_resource.name} as SELinux is disabled")
|
106
|
+
return
|
107
|
+
end
|
108
|
+
|
109
|
+
unless current_port_context.empty?
|
110
|
+
converge_by "Deleting context from port #{new_resource.port}/#{new_resource.protocol}" do
|
111
|
+
shell_out!("semanage port -d -p #{new_resource.protocol} #{new_resource.port}")
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|