bigtop-deploy/puppet/modules/kerberos/manifests/init.pp (180 lines of code) (raw):
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You 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.
class kerberos {
class deploy ($roles) {
if ("kerberos-server" in $roles) {
include kerberos::server
include kerberos::kdc
include kerberos::kdc::admin_server
}
}
class krb_site ($domain = inline_template('<%= @domain %>'),
$realm = inline_template('<%= @domain.upcase %>'),
$kdc_server = 'localhost',
$kdc_port = '88',
$admin_port = 749,
$keytab_export_dir = "/var/lib/bigtop_keytabs") {
case $operatingsystem {
'ubuntu','debian': {
$package_name_kdc = 'krb5-kdc'
$service_name_kdc = 'krb5-kdc'
$package_name_admin = 'krb5-admin-server'
$service_name_admin = 'krb5-admin-server'
$package_name_client = 'krb5-user'
$exec_path = '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
$kdc_etc_path = '/etc/krb5kdc'
$kdc_db_path = '/var/lib/krb5kdc'
}
# default assumes CentOS, Redhat 5 series (just look at how random it all looks :-()
default: {
$package_name_kdc = 'krb5-server'
$service_name_kdc = 'krb5kdc'
$package_name_admin = 'krb5-libs'
$service_name_admin = 'kadmin'
$package_name_client = 'krb5-workstation'
$exec_path = '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/kerberos/sbin:/usr/kerberos/bin'
$kdc_etc_path = '/var/kerberos/krb5kdc'
$kdc_db_path = '/var/kerberos/krb5kdc'
}
}
file { "/etc/krb5.conf":
content => template('kerberos/krb5.conf'),
owner => "root",
group => "root",
mode => "0644",
}
@file { $keytab_export_dir:
ensure => directory,
owner => "root",
group => "root",
}
# Required for SPNEGO
@kerberos::principal { "HTTP":
}
}
class kdc inherits kerberos::krb_site {
Class['kerberos::kdc'] -> Class['hadoop_cluster_node']
package { $package_name_kdc:
ensure => installed,
}
file { $kdc_etc_path:
ensure => directory,
owner => root,
group => root,
mode => "0700",
require => Package["$package_name_kdc"],
}
file { "${kdc_etc_path}/kdc.conf":
content => template('kerberos/kdc.conf'),
require => Package["$package_name_kdc"],
owner => "root",
group => "root",
mode => "0644",
}
file { "${kdc_etc_path}/kadm5.acl":
content => template('kerberos/kadm5.acl'),
require => Package["$package_name_kdc"],
owner => "root",
group => "root",
mode => "0644",
}
exec { "kdb5_util":
path => $exec_path,
command => "rm -f /etc/kadm5.keytab ; kdb5_util -P cthulhu -r ${realm} create -s && kadmin.local -q 'cpw -pw secure kadmin/admin'",
creates => "${kdc_etc_path}/stash",
subscribe => File["${kdc_etc_path}/kdc.conf"],
# refreshonly => true,
require => [Package["$package_name_kdc"], Package["$package_name_admin"], File["${kdc_etc_path}/kdc.conf"], File["/etc/krb5.conf"]],
}
service { $service_name_kdc:
ensure => running,
require => [Package["$package_name_kdc"], File["${kdc_etc_path}/kdc.conf"], Exec["kdb5_util"]],
subscribe => [File["${kdc_etc_path}/kadm5.acl"], File["${kdc_etc_path}/kdc.conf"]],
hasrestart => true,
}
class admin_server inherits kerberos::kdc {
package { "$package_name_admin":
ensure => installed,
require => Package["$package_name_kdc"],
}
exec { '/usr/bin/setsebool -P kadmind_disable_trans 1':
onlyif => '/usr/bin/test -f /usr/bin/setsebook'
} ->
exec { '/usr/bin/setsebool -P krb5kdc_disable_trans 1':
onlyif => '/usr/bin/test -f /usr/bin/setsebook'
} ->
service { "$service_name_admin":
ensure => running,
require => [Package["$package_name_admin"], Service["$service_name_kdc"]],
subscribe => [File["${kdc_etc_path}/kadm5.acl"], File["${kdc_etc_path}/kdc.conf"]],
hasrestart => true,
}
}
}
class client inherits kerberos::krb_site {
package { $package_name_client:
ensure => installed,
}
}
class server {
include kerberos::client
class { "kerberos::kdc": }
->
Class["kerberos::client"]
class { "kerberos::kdc::admin_server": }
->
Class["kerberos::client"]
}
define principal {
require "kerberos::client"
realize(File[$kerberos::krb_site::keytab_export_dir])
$principal = "$title/$::fqdn"
$keytab = "$kerberos::krb_site::keytab_export_dir/$title.keytab"
exec { "addprinc.$title":
path => $kerberos::krb_site::exec_path,
command => "kadmin -w secure -p kadmin/admin -q 'addprinc -randkey $principal'",
unless => "kadmin -w secure -p kadmin/admin -q listprincs | grep -q $principal",
require => Package[$kerberos::krb_site::package_name_client],
tries => 180,
try_sleep => 1,
}
->
exec { "xst.$title":
path => $kerberos::krb_site::exec_path,
command => "kadmin -w secure -p kadmin/admin -q 'xst -k $keytab $principal'",
unless => "klist -kt $keytab 2>/dev/null | grep -q $principal",
require => File[$kerberos::krb_site::keytab_export_dir],
}
}
define host_keytab($princs = [ $title ], $spnego = disabled,
$owner = $title, $group = "", $mode = "0400",
) {
$keytab = "/etc/$title.keytab"
$internal_princs = $spnego ? {
true => [ 'HTTP' ],
'enabled' => [ 'HTTP' ],
default => [ ],
}
realize(Kerberos::Principal[$internal_princs])
$includes = inline_template("<%=
[@princs, @internal_princs].flatten.map { |x|
\"rkt $kerberos::krb_site::keytab_export_dir/#{x}.keytab\"
}.join(\"\n\")
%>")
kerberos::principal { $princs:
}
exec { "ktinject.$title":
path => $kerberos::krb_site::exec_path,
command => "ktutil <<EOF
$includes
wkt $keytab
EOF
chown ${owner}:${group} ${keytab}
chmod ${mode} ${keytab}",
creates => $keytab,
require => [ Kerberos::Principal[$princs],
Kerberos::Principal[$internal_princs] ],
}
exec { "aquire $title keytab":
path => $kerberos::krb_site::exec_path,
user => $owner,
command => "bash -c 'kinit -kt $keytab ${title}/$::fqdn ; kinit -R'",
require => Exec["ktinject.$title"],
}
}
}