init.pp 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. # Licensed to the Apache Software Foundation (ASF) under one or more
  2. # contributor license agreements. See the NOTICE file distributed with
  3. # this work for additional information regarding copyright ownership.
  4. # The ASF licenses this file to You under the Apache License, Version 2.0
  5. # (the "License"); you may not use this file except in compliance with
  6. # the License. You may obtain a copy of the License at
  7. #
  8. # http://www.apache.org/licenses/LICENSE-2.0
  9. #
  10. # Unless required by applicable law or agreed to in writing, software
  11. # distributed under the License is distributed on an "AS IS" BASIS,
  12. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. # See the License for the specific language governing permissions and
  14. # limitations under the License.
  15. class kerberos {
  16. class site {
  17. # The following is our interface to the world. This is what we allow
  18. # users to tweak from the outside (see tests/init.pp for a complete
  19. # example) before instantiating target classes.
  20. # Once we migrate to Puppet 2.6 we can potentially start using
  21. # parametrized classes instead.
  22. $domain = $kerberos_domain ? { '' => inline_template('<%= domain %>'),
  23. default => $kerberos_domain }
  24. $realm = $kerberos_realm ? { '' => inline_template('<%= domain.upcase %>'),
  25. default => $kerberos_realm }
  26. $kdc_server = $kerberos_kdc_server ? { '' => 'localhost',
  27. default => $kerberos_kdc_server }
  28. $kdc_port = $kerberos_kdc_port ? { '' => '88',
  29. default => $kerberos_kdc_port }
  30. $admin_port = 749 /* BUG: linux daemon packaging doesn't let us tweak this */
  31. $keytab_export_dir = "/var/lib/bigtop_keytabs"
  32. case $operatingsystem {
  33. 'ubuntu': {
  34. $package_name_kdc = 'krb5-kdc'
  35. $service_name_kdc = 'krb5-kdc'
  36. $package_name_admin = 'krb5-admin-server'
  37. $service_name_admin = 'krb5-admin-server'
  38. $package_name_client = 'krb5-user'
  39. $exec_path = '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
  40. $kdc_etc_path = '/etc/krb5kdc/'
  41. }
  42. # default assumes CentOS, Redhat 5 series (just look at how random it all looks :-()
  43. default: {
  44. $package_name_kdc = 'krb5-server'
  45. $service_name_kdc = 'krb5kdc'
  46. $package_name_admin = 'krb5-libs'
  47. $service_name_admin = 'kadmin'
  48. $package_name_client = 'krb5-workstation'
  49. $exec_path = '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/kerberos/sbin:/usr/kerberos/bin'
  50. $kdc_etc_path = '/var/kerberos/krb5kdc/'
  51. }
  52. }
  53. file { "/etc/krb5.conf":
  54. content => template('kerberos/krb5.conf'),
  55. owner => "root",
  56. group => "root",
  57. mode => "0644",
  58. }
  59. @file { $keytab_export_dir:
  60. ensure => directory,
  61. owner => "root",
  62. group => "root",
  63. }
  64. # Required for SPNEGO
  65. @principal { "HTTP":
  66. }
  67. }
  68. class kdc inherits kerberos::site {
  69. package { $package_name_kdc:
  70. ensure => installed,
  71. }
  72. file { $kdc_etc_path:
  73. ensure => directory,
  74. owner => root,
  75. group => root,
  76. mode => "0700",
  77. require => Package["$package_name_kdc"],
  78. }
  79. file { "${kdc_etc_path}/kdc.conf":
  80. content => template('kerberos/kdc.conf'),
  81. require => Package["$package_name_kdc"],
  82. owner => "root",
  83. group => "root",
  84. mode => "0644",
  85. }
  86. file { "${kdc_etc_path}/kadm5.acl":
  87. content => template('kerberos/kadm5.acl'),
  88. require => Package["$package_name_kdc"],
  89. owner => "root",
  90. group => "root",
  91. mode => "0644",
  92. }
  93. exec { "kdb5_util":
  94. path => $exec_path,
  95. command => "rm -f /etc/kadm5.keytab ; kdb5_util -P cthulhu -r ${realm} create -s && kadmin.local -q 'cpw -pw secure kadmin/admin'",
  96. creates => "${kdc_etc_path}/stash",
  97. subscribe => File["${kdc_etc_path}/kdc.conf"],
  98. # refreshonly => true,
  99. require => [Package["$package_name_kdc"], File["${kdc_etc_path}/kdc.conf"], File["/etc/krb5.conf"]],
  100. }
  101. service { $service_name_kdc:
  102. ensure => running,
  103. require => [Package["$package_name_kdc"], File["${kdc_etc_path}/kdc.conf"], Exec["kdb5_util"]],
  104. subscribe => File["${kdc_etc_path}/kdc.conf"],
  105. hasrestart => true,
  106. }
  107. class admin_server inherits kerberos::kdc {
  108. $se_hack = "setsebool -P kadmind_disable_trans 1 ; setsebool -P krb5kdc_disable_trans 1"
  109. package { "$package_name_admin":
  110. ensure => installed,
  111. require => Package["$package_name_kdc"],
  112. }
  113. service { "$service_name_admin":
  114. ensure => running,
  115. require => [Package["$package_name_admin"], Service["$service_name_kdc"]],
  116. hasrestart => true,
  117. restart => "${se_hack} ; service ${service_name_admin} restart",
  118. start => "${se_hack} ; service ${service_name_admin} start",
  119. }
  120. }
  121. }
  122. class client inherits kerberos::site {
  123. package { $package_name_client:
  124. ensure => installed,
  125. }
  126. }
  127. class server {
  128. include kerberos::client
  129. class { "kerberos::kdc": }
  130. ->
  131. Class["kerberos::client"]
  132. class { "kerberos::kdc::admin_server": }
  133. ->
  134. Class["kerberos::client"]
  135. }
  136. define principal {
  137. require "kerberos::client"
  138. realize(File[$kerberos::site::keytab_export_dir])
  139. $principal = "$title/$::fqdn"
  140. $keytab = "$kerberos::site::keytab_export_dir/$title.keytab"
  141. exec { "addprinc.$title":
  142. path => $kerberos::site::exec_path,
  143. command => "kadmin -w secure -p kadmin/admin -q 'addprinc -randkey $principal'",
  144. unless => "kadmin -w secure -p kadmin/admin -q listprincs | grep -q $principal",
  145. require => Package[$kerberos::site::package_name_client],
  146. }
  147. ->
  148. exec { "xst.$title":
  149. path => $kerberos::site::exec_path,
  150. command => "kadmin -w secure -p kadmin/admin -q 'xst -k $keytab $principal'",
  151. unless => "klist -kt $keytab 2>/dev/null | grep -q $principal",
  152. require => File[$kerberos::site::keytab_export_dir],
  153. }
  154. }
  155. define host_keytab($princs = undef, $spnego = disabled) {
  156. $keytab = "/etc/$title.keytab"
  157. $requested_princs = $princs ? {
  158. undef => [ $title ],
  159. default => $princs,
  160. }
  161. $internal_princs = $spnego ? {
  162. /(true|enabled)/ => [ 'HTTP' ],
  163. default => [ ],
  164. }
  165. realize(Kerberos::Principal[$internal_princs])
  166. $includes = inline_template("<%=
  167. [requested_princs, internal_princs].flatten.map { |x|
  168. \"rkt $kerberos::site::keytab_export_dir/#{x}.keytab\"
  169. }.join(\"\n\")
  170. %>")
  171. kerberos::principal { $requested_princs:
  172. }
  173. exec { "ktinject.$title":
  174. path => $kerberos::site::exec_path,
  175. command => "/usr/bin/ktutil <<EOF
  176. $includes
  177. wkt $keytab
  178. EOF
  179. chown $title $keytab",
  180. creates => $keytab,
  181. require => [ Kerberos::Principal[$requested_princs],
  182. Kerberos::Principal[$internal_princs] ],
  183. }
  184. }
  185. }