chef-provisioning-aws 1.8.0 → 1.9.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3aed5292d699880d31eaffbff1b415985250bb92
4
- data.tar.gz: c6f7e4c96e7b7c1a7a28a02c336666b0f03d1aa0
3
+ metadata.gz: 5474ba34beb9fa261bd2c3abbe9561772bd36877
4
+ data.tar.gz: 602d8d0ce78d094d41e0982e97ddd42654528777
5
5
  SHA512:
6
- metadata.gz: 368067e2bc0e09bd9de87fe78c65b0c7ecfa3d55e1506783d552a77ff220dea5666c271f7f68625613b85bb9f5faef27abad62b3e9a34314b9dbe7e0a4309274
7
- data.tar.gz: e8f0f0fa76803d7b13ab449ae4a4a50a2e254183a384efc24ada0a417a9c6e6761e6eecf2b4d55792f5bae763e74fa8105d1000d28cedb58a30a731881915f2c
6
+ metadata.gz: e410f83858985cc03647c57e074aafd8ad8ec7d9db663c0ed02c477823a33b70f06a7152b815c47298a35fbb8ef319565686fa7cade07db53100d4aea164322f
7
+ data.tar.gz: d42f36a75e6644ffc964e6cfc794e8cab50ca7622553e9310669d2630a5e5478a674581adcaadbf3f0e3003e5487efaa7b1a2a559ae03d2c73ef1438a34e3da0
data/README.md CHANGED
@@ -149,6 +149,8 @@ with_machine_options({
149
149
  use_private_ip_for_ssh: false, # DEPRECATED, use `transport_address_location`
150
150
  transport_address_location: :public_ip, # `:public_ip` (default), `:private_ip` or `:dns`. Defines how SSH or WinRM should find an address to communicate with the instance.
151
151
  is_windows: true, # false by default
152
+ winrm_username: "Administrator",
153
+ winrm_password: "password", # Override if you have specified your own password and are not fetching the password from AWS
152
154
  })
153
155
  ```
154
156
 
@@ -181,7 +183,14 @@ load_balancer "my_elb" do
181
183
  port: 443,
182
184
  ssl_certificate_id: "arn:aws:iam::360965486607:server-certificate/cloudfront/foreflight-2015-07-09"
183
185
  }
184
- ]
186
+ ],
187
+ health_check: {
188
+ healthy_threshold: 2,
189
+ unhealthy_threshold: 4,
190
+ interval: 12,
191
+ timeout: 5,
192
+ target: 'HTTPS:443/_status'
193
+ }
185
194
  })
186
195
  ```
187
196
 
data/Rakefile CHANGED
@@ -53,6 +53,7 @@ RSpec::Core::RakeTask.new(:machine_image) do |spec|
53
53
  spec.rspec_opts = "-b -t super_slow -e 'machine_image can create an image in the VPC'"
54
54
  end
55
55
 
56
+ require "chef/provisioning/aws_driver/version"
56
57
  require "github_changelog_generator/task"
57
58
 
58
59
  GitHubChangelogGenerator::RakeTask.new :changelog do |config|
@@ -598,6 +598,44 @@ winrm set winrm/config/service/auth '@{Basic="true"}'
598
598
  netsh advfirewall firewall add rule name="WinRM 5985" protocol=TCP dir=in localport=5985 action=allow
599
599
  netsh advfirewall firewall add rule name="WinRM 5986" protocol=TCP dir=in localport=5986 action=allow
600
600
 
601
+ net stop winrm
602
+ sc config winrm start=auto
603
+ net start winrm
604
+ </powershell>
605
+ EOD
606
+ end
607
+
608
+ def https_user_data
609
+ <<EOD
610
+ <powershell>
611
+ winrm quickconfig -q
612
+ winrm set winrm/config/winrs '@{MaxMemoryPerShellMB="300"}'
613
+ winrm set winrm/config '@{MaxTimeoutms="1800000"}'
614
+
615
+ netsh advfirewall firewall add rule name="WinRM 5986" protocol=TCP dir=in localport=5986 action=allow
616
+
617
+ $SourceStoreScope = 'LocalMachine'
618
+ $SourceStorename = 'Remote Desktop'
619
+
620
+ $SourceStore = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Store -ArgumentList $SourceStorename, $SourceStoreScope
621
+ $SourceStore.Open([System.Security.Cryptography.X509Certificates.OpenFlags]::ReadOnly)
622
+
623
+ $cert = $SourceStore.Certificates | Where-Object -FilterScript {
624
+ $_.subject -like '*'
625
+ }
626
+
627
+ $DestStoreScope = 'LocalMachine'
628
+ $DestStoreName = 'My'
629
+
630
+ $DestStore = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Store -ArgumentList $DestStoreName, $DestStoreScope
631
+ $DestStore.Open([System.Security.Cryptography.X509Certificates.OpenFlags]::ReadWrite)
632
+ $DestStore.Add($cert)
633
+
634
+ $SourceStore.Close()
635
+ $DestStore.Close()
636
+
637
+ winrm create winrm/config/listener?Address=*+Transport=HTTPS `@`{Hostname=`"($certId)`"`;CertificateThumbprint=`"($cert.Thumbprint)`"`}
638
+
601
639
  net stop winrm
602
640
  sc config winrm start=auto
603
641
  net start winrm
@@ -648,11 +686,14 @@ EOD
648
686
  # sending out encrypted password, restarting instance, etc.
649
687
  if machine_spec.reference['is_windows']
650
688
  wait_until_machine(action_handler, machine_spec, "receive 'Windows is ready' message from the AWS console", instance) { |instance|
651
- output = instance.console_output.output
652
- if output.nil? || output.empty?
689
+ instance.console_output.output
690
+ # seems to be a bug as we need to run this twice
691
+ # to consistently ensure the output is fully pulled
692
+ encoded_output = instance.console_output.output
693
+ if encoded_output.nil? || encoded_output.empty?
653
694
  false
654
695
  else
655
- output = Base64.decode64(output)
696
+ output = Base64.decode64(encoded_output)
656
697
  output =~ /Message: Windows is Ready to use/
657
698
  end
658
699
  }
@@ -845,10 +886,18 @@ EOD
845
886
  end
846
887
 
847
888
  if machine_options[:is_windows]
848
- Chef::Log.debug "Setting Default WinRM userdata for windows..."
849
- bootstrap_options[:user_data] = Base64.encode64(user_data) if bootstrap_options[:user_data].nil?
889
+ Chef::Log.debug "Setting Default windows userdata based on WinRM transport"
890
+ if bootstrap_options[:user_data].nil?
891
+ case machine_options[:winrm_transport]
892
+ when 'https'
893
+ data = https_user_data
894
+ else
895
+ data = user_data
896
+ end
897
+ bootstrap_options[:user_data] = Base64.encode64(data)
898
+ end
850
899
  else
851
- Chef::Log.debug "Non-windows, not setting userdata"
900
+ Chef::Log.debug "Non-windows, not setting Default userdata"
852
901
  end
853
902
 
854
903
  bootstrap_options = AWSResource.lookup_options(bootstrap_options, managed_entry_store: machine_spec.managed_entry_store, driver: self)
@@ -984,31 +1033,115 @@ EOD
984
1033
 
985
1034
  def create_winrm_transport(machine_spec, machine_options, instance)
986
1035
  remote_host = determine_remote_host(machine_spec, instance)
1036
+ username = machine_options[:winrm_username] || 'Administrator'
1037
+ # default to http for now, should upgrade to https when knife support self-signed
1038
+ transport_type = machine_options[:winrm_transport] || 'http'
1039
+ type = case transport_type
1040
+ when 'http'
1041
+ :plaintext
1042
+ when 'https'
1043
+ :ssl
1044
+ end
1045
+ if machine_spec.reference[:winrm_port]
1046
+ port = machine_spec.reference[:winrm_port]
1047
+ else #default port
1048
+ port = case transport_type
1049
+ when 'http'
1050
+ '5985'
1051
+ when 'https'
1052
+ '5986'
1053
+ end
1054
+ end
1055
+ endpoint = "#{transport_type}://#{remote_host}:#{port}/wsman"
987
1056
 
988
- port = machine_spec.reference['winrm_port'] || 5985
989
- endpoint = "http://#{remote_host}:#{port}/wsman"
990
- type = :plaintext
991
1057
  pem_bytes = get_private_key(instance.key_name)
992
1058
 
993
- # TODO plaintext password = bad
994
- password = machine_spec.reference['winrm_password']
995
- if password.nil? || password.empty?
996
- encrypted_admin_password = instance.password_data.password_data
997
- if encrypted_admin_password.nil? || encrypted_admin_password.empty?
998
- raise "You did not specify winrm_password in the machine options and no encrytpted password could be fetched from the instance"
1059
+ if machine_options[:winrm_password]
1060
+ password = machine_options[:winrm_password]
1061
+ else # pull from ec2 and store in reference
1062
+ if machine_spec.reference['winrm_encrypted_password']
1063
+ decoded = Base64.decode64(machine_spec.reference['winrm_encrypted_password'])
1064
+ else
1065
+ encrypted_admin_password = instance.password_data.password_data
1066
+ if encrypted_admin_password.nil? || encrypted_admin_password.empty?
1067
+ raise "You did not specify winrm_password in the machine options and no encrytpted password could be fetched from the instance"
1068
+ end
1069
+
1070
+ machine_spec.reference['winrm_encrypted_password']||=encrypted_admin_password
1071
+ # ^^ saves encrypted password to the machine_spec
1072
+ decoded = Base64.decode64(encrypted_admin_password)
999
1073
  end
1000
- decoded = Base64.decode64(encrypted_admin_password)
1001
- private_key = OpenSSL::PKey::RSA.new(pem_bytes)
1074
+ # decrypt so we can utilize
1075
+ private_key = OpenSSL::PKey::RSA.new(get_private_key(instance.key_name))
1002
1076
  password = private_key.private_decrypt decoded
1003
1077
  end
1004
1078
 
1079
+ disable_sspi = machine_options[:winrm_disable_sspi] || false # default to Negotiate
1080
+ basic_auth_only = machine_options[:winrm_basic_auth_only] || false # disallow Basic auth by default
1081
+ no_ssl_peer_verification = machine_options[:winrm_no_ssl_peer_verification] || false #disallow MITM potential by default
1082
+
1005
1083
  winrm_options = {
1006
- :user => machine_spec.reference['winrm_username'] || 'Administrator',
1007
- :pass => password,
1008
- :disable_sspi => true,
1009
- :basic_auth_only => true
1084
+ user: username,
1085
+ pass: password,
1086
+ disable_sspi: disable_sspi,
1087
+ basic_auth_only: basic_auth_only,
1088
+ no_ssl_peer_verification: no_ssl_peer_verification,
1010
1089
  }
1011
1090
 
1091
+ if no_ssl_peer_verification or type != :ssl
1092
+ # => we won't verify certs at all
1093
+ Chef::Log.info "No SSL or no peer verification"
1094
+ elsif machine_spec.reference['winrm_ssl_thumbprint']
1095
+ # we have stored the cert
1096
+ Chef::Log.info "Using stored fingerprint"
1097
+ else
1098
+ # we need to retrieve the cert and verify it by connecting just to
1099
+ # retrieve the ssl certificate and compare it to what we see in the
1100
+ # console logs
1101
+ instance.console_output.data.output
1102
+ # again this seem to need to be run twice, to ensure
1103
+ encoded_output = instance.console_output.data.output
1104
+ console_lines = Base64.decode64(encoded_output).lines
1105
+ fp_context = OpenSSL::SSL::SSLContext.new
1106
+ tcp_connection = TCPSocket.new(instance.private_ip_address, port)
1107
+ ssl_connection = OpenSSL::SSL::SSLSocket.new(tcp_connection, fp_context)
1108
+
1109
+ begin
1110
+ ssl_connection.connect
1111
+ rescue OpenSSL::SSL::SSLError => e
1112
+ raise e unless e.message =~ /bad signature/
1113
+ ensure
1114
+ tcp_connection.close
1115
+ end
1116
+
1117
+ winrm_cert = ssl_connection.peer_cert_chain.first
1118
+
1119
+ rdp_thumbprint = console_lines.grep(
1120
+ /RDPCERTIFICATE-THUMBPRINT/)[-1].split(': ').last.chomp
1121
+ rdp_subject = console_lines.grep(
1122
+ /RDPCERTIFICATE-SUBJECTNAME/)[-1].split(': ').last.chomp
1123
+ winrm_subject = winrm_cert.subject.to_s.split('=').last.upcase
1124
+ winrm_thumbprint=OpenSSL::Digest::SHA1.new(winrm_cert.to_der).to_s.upcase
1125
+
1126
+ if rdp_subject != winrm_subject or rdp_thumbprint != winrm_thumbprint
1127
+ Chef::Log.fatal "Winrm ssl port certificate differs from rdp console logs"
1128
+ end
1129
+ # now cache these for later use in the reference
1130
+ if machine_spec.reference['winrm_ssl_subject'] != winrm_subject
1131
+ machine_spec.reference['winrm_ssl_subject'] = winrm_subject
1132
+ end
1133
+ if machine_spec.reference['winrm_ssl_thumbprint'] != winrm_thumbprint
1134
+ machine_spec.reference['winrm_ssl_thumbprint'] = winrm_thumbprint
1135
+ end
1136
+ if machine_spec.reference['winrm_ssl_cert'] != winrm_cert.to_pem
1137
+ machine_spec.reference['winrm_ssl_cert'] = winrm_cert.to_pem
1138
+ end
1139
+ end
1140
+
1141
+ if machine_spec.reference['winrm_ssl_thumbprint']
1142
+ winrm_options[:ssl_peer_fingerprint] = machine_spec.reference['winrm_ssl_thumbprint']
1143
+ end
1144
+
1012
1145
  Chef::Provisioning::Transport::WinRM.new("#{endpoint}", type, winrm_options, {})
1013
1146
  end
1014
1147
 
@@ -1,7 +1,7 @@
1
1
  class Chef
2
2
  module Provisioning
3
3
  module AWSDriver
4
- VERSION = '1.8.0'
4
+ VERSION = '1.9.0'
5
5
  end
6
6
  end
7
7
  end
@@ -13,7 +13,7 @@ class Chef::Resource::AwsInstance < Chef::Provisioning::AWSDriver::AWSResourceWi
13
13
  attribute :name, kind_of: String, name_attribute: true
14
14
 
15
15
  attribute :instance_id, kind_of: String, aws_id_attribute: true, default: lazy {
16
- name =~ /^i-[a-f0-9]{8}$/ ? name : nil
16
+ name =~ /^i-(?:[a-f0-9]{8}|[a-f0-9]{17})$/ ? name : nil
17
17
  }
18
18
 
19
19
  def aws_object
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chef-provisioning-aws
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.0
4
+ version: 1.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Ewart
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-03 00:00:00.000000000 Z
11
+ date: 2016-04-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: chef-provisioning
@@ -307,7 +307,6 @@ files:
307
307
  - lib/chef/resource/aws_subnet.rb
308
308
  - lib/chef/resource/aws_vpc.rb
309
309
  - lib/chef/resource/aws_vpc_peering_connection.rb
310
- - spec/acceptance/aws_ebs_volume/nodes/ettores-mbp.lan.json
311
310
  - spec/aws_support.rb
312
311
  - spec/aws_support/aws_resource_run_wrapper.rb
313
312
  - spec/aws_support/deep_matcher.rb
@@ -372,7 +371,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
372
371
  version: '0'
373
372
  requirements: []
374
373
  rubyforge_project:
375
- rubygems_version: 2.4.5.1
374
+ rubygems_version: 2.6.3
376
375
  signing_key:
377
376
  specification_version: 4
378
377
  summary: Provisioner for creating aws containers in Chef Provisioning.
@@ -1,3 +0,0 @@
1
- {
2
- "name": "ettores-mbp.lan"
3
- }