itchef/cookbooks/cpe_applocker/resources/cpe_applocker.rb (59 lines of code) (raw):
# vim: syntax=ruby:expandtab:shiftwidth=2:softtabstop=2:tabstop=2
#
# Cookbook Name:: cpe_applocker
# Resource:: applocker
#
# Copyright (c) Facebook, Inc. and its affiliates.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
resource_name :cpe_applocker
provides :cpe_applocker, :os => 'windows'
default_action :configure
property :applocker_rules, Hash
# Before processing our action, we first derive the current state of Applocker
# on the local system to ensure that we only process if the configuration state
# has changed.
load_current_value do
extend CPE::Applocker
begin
# In order to ensure we can process policies with non-US char sets
# We firest set the 'code page' of Windows to UTF-8 with chcp. This
# is only active for the shell out session, and resets after exit.
current_state = powershell_out(
'chcp 65001 | Out-Null; Get-ApplockerPolicy -Effective -Xml',
).stdout
rescue
Chef::Log.warn('Failed to retrieve the effective AppLocker policy')
end
xml = Nokogiri::XML(current_state)
unless xml.errors.empty?
Chef::Log.error(
"Failed to parse Applocker policy from system with #{xml.errors}",
)
# Return so we don't tank the Chef run
return
end
applocker_rules xml_to_hash(xml)
end
action_class do
include CPE::Applocker
def uninstall_applocker
# Disable autostart of the service. A common theme I've seen is that one
# cannot disable the AppIDSvc service, even as SYSTEM, via CLI utils. A
# "hack" I found online was to modify the services registry configuration
# for startup, which is sufficient for our needs.
appidsvc = 'HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet' +
'\\Services\\AppIDSvc'
registry_key appidsvc do
values [{
:name => 'Start',
:type => :dword,
:data => 3,
}]
action :create
end
# Lastly stop the service
service 'AppIDSvc' do
supports :restart => true, :stop => true
action [:stop]
timeout 120
end
end
def configure_applocker
return unless node['cpe_applocker']['enabled']
# Applocker is installed by turning on the Application ID Service, we
# handle the configuration of the 4 rules in the `configure` step
service 'AppIDSvc' do
supports :restart => true, :stop => true
action [:enable, :start]
end
end
end
action :uninstall do
# Remove app locker policies
clear_applocker_policy
# Lastly disable the service and set the startup type to manual
uninstall_applocker
end
action :configure do
converge_if_changed :applocker_rules do
set_applocker_policy
end
# We always want to ensure the service is online
configure_applocker
end