Skip to content

Commit 34f9da4

Browse files
balasankarcRobert Marshall
authored andcommitted
Support specifying encrypted secrets path for Redis
Closes https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/6275 Changelog: added Signed-off-by: Balasankar "Balu" C <[email protected]>
1 parent 6fecf7a commit 34f9da4

File tree

5 files changed

+70
-6
lines changed

5 files changed

+70
-6
lines changed

files/gitlab-cookbooks/gitlab/attributes/default.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,6 +446,7 @@
446446
default['gitlab']['gitlab_rails']['redis_tls_client_cert_file'] = nil
447447
default['gitlab']['gitlab_rails']['redis_tls_client_key_file'] = nil
448448
default['gitlab']['gitlab_rails']['redis_password'] = nil
449+
default['gitlab']['gitlab_rails']['redis_encrypted_settings_file'] = nil
449450
default['gitlab']['gitlab_rails']['redis_socket'] = "/var/opt/gitlab/redis/redis.socket"
450451
default['gitlab']['gitlab_rails']['redis_enable_client'] = true
451452
default['gitlab']['gitlab_rails']['redis_sentinels'] = []
@@ -455,6 +456,7 @@
455456
default['gitlab']['gitlab_rails']['redis_cache_sentinels_password'] = nil
456457
default['gitlab']['gitlab_rails']['redis_cache_username'] = nil
457458
default['gitlab']['gitlab_rails']['redis_cache_password'] = nil
459+
default['gitlab']['gitlab_rails']['redis_cache_encrypted_settings_file'] = nil
458460
default['gitlab']['gitlab_rails']['redis_cache_cluster_nodes'] = []
459461
default['gitlab']['gitlab_rails']['redis_cache_ssl'] = false
460462
default['gitlab']['gitlab_rails']['redis_cache_tls_ca_cert_dir'] = default['gitlab']['gitlab_rails']['redis_tls_ca_cert_dir'].dup
@@ -464,6 +466,7 @@
464466
default['gitlab']['gitlab_rails']['redis_queues_instance'] = nil
465467
default['gitlab']['gitlab_rails']['redis_queues_username'] = nil
466468
default['gitlab']['gitlab_rails']['redis_queues_password'] = nil
469+
default['gitlab']['gitlab_rails']['redis_queues_encrypted_settings_file'] = nil
467470
default['gitlab']['gitlab_rails']['redis_queues_sentinels'] = []
468471
default['gitlab']['gitlab_rails']['redis_queues_sentinels_password'] = nil
469472
default['gitlab']['gitlab_rails']['redis_queues_cluster_nodes'] = []
@@ -477,6 +480,7 @@
477480
default['gitlab']['gitlab_rails']['redis_shared_state_sentinels_password'] = nil
478481
default['gitlab']['gitlab_rails']['redis_shared_state_username'] = nil
479482
default['gitlab']['gitlab_rails']['redis_shared_state_password'] = nil
483+
default['gitlab']['gitlab_rails']['redis_shared_state_encrypted_settings_file'] = nil
480484
default['gitlab']['gitlab_rails']['redis_shared_state_cluster_nodes'] = []
481485
default['gitlab']['gitlab_rails']['redis_shared_state_ssl'] = false
482486
default['gitlab']['gitlab_rails']['redis_shared_state_tls_ca_cert_dir'] = default['gitlab']['gitlab_rails']['redis_tls_ca_cert_dir'].dup
@@ -488,6 +492,7 @@
488492
default['gitlab']['gitlab_rails']['redis_trace_chunks_sentinels_password'] = nil
489493
default['gitlab']['gitlab_rails']['redis_trace_chunks_username'] = nil
490494
default['gitlab']['gitlab_rails']['redis_trace_chunks_password'] = nil
495+
default['gitlab']['gitlab_rails']['redis_trace_chunks_encrypted_settings_file'] = nil
491496
default['gitlab']['gitlab_rails']['redis_trace_chunks_cluster_nodes'] = []
492497
default['gitlab']['gitlab_rails']['redis_trace_chunks_ssl'] = false
493498
default['gitlab']['gitlab_rails']['redis_trace_chunks_tls_ca_cert_dir'] = default['gitlab']['gitlab_rails']['redis_tls_ca_cert_dir'].dup
@@ -499,6 +504,7 @@
499504
default['gitlab']['gitlab_rails']['redis_actioncable_sentinels_password'] = nil
500505
default['gitlab']['gitlab_rails']['redis_actioncable_username'] = nil
501506
default['gitlab']['gitlab_rails']['redis_actioncable_password'] = nil
507+
default['gitlab']['gitlab_rails']['redis_actioncable_encrypted_settings_file'] = nil
502508
default['gitlab']['gitlab_rails']['redis_actioncable_cluster_nodes'] = []
503509
default['gitlab']['gitlab_rails']['redis_actioncable_ssl'] = false
504510
default['gitlab']['gitlab_rails']['redis_actioncable_tls_ca_cert_dir'] = default['gitlab']['gitlab_rails']['redis_tls_ca_cert_dir'].dup
@@ -510,6 +516,7 @@
510516
default['gitlab']['gitlab_rails']['redis_rate_limiting_sentinels_password'] = nil
511517
default['gitlab']['gitlab_rails']['redis_rate_limiting_username'] = nil
512518
default['gitlab']['gitlab_rails']['redis_rate_limiting_password'] = nil
519+
default['gitlab']['gitlab_rails']['redis_rate_limiting_encrypted_settings_file'] = nil
513520
default['gitlab']['gitlab_rails']['redis_rate_limiting_cluster_nodes'] = []
514521
default['gitlab']['gitlab_rails']['redis_rate_limiting_ssl'] = false
515522
default['gitlab']['gitlab_rails']['redis_rate_limiting_tls_ca_cert_dir'] = default['gitlab']['gitlab_rails']['redis_tls_ca_cert_dir'].dup
@@ -521,6 +528,7 @@
521528
default['gitlab']['gitlab_rails']['redis_sessions_sentinels_password'] = nil
522529
default['gitlab']['gitlab_rails']['redis_sessions_username'] = nil
523530
default['gitlab']['gitlab_rails']['redis_sessions_password'] = nil
531+
default['gitlab']['gitlab_rails']['redis_sessions_encrypted_settings_file'] = nil
524532
default['gitlab']['gitlab_rails']['redis_sessions_cluster_nodes'] = []
525533
default['gitlab']['gitlab_rails']['redis_sessions_ssl'] = false
526534
default['gitlab']['gitlab_rails']['redis_sessions_tls_ca_cert_dir'] = default['gitlab']['gitlab_rails']['redis_tls_ca_cert_dir'].dup
@@ -532,6 +540,7 @@
532540
default['gitlab']['gitlab_rails']['redis_repository_cache_sentinels_password'] = nil
533541
default['gitlab']['gitlab_rails']['redis_repository_cache_username'] = nil
534542
default['gitlab']['gitlab_rails']['redis_repository_cache_password'] = nil
543+
default['gitlab']['gitlab_rails']['redis_repository_cache_encrypted_settings_file'] = nil
535544
default['gitlab']['gitlab_rails']['redis_repository_cache_cluster_nodes'] = []
536545
default['gitlab']['gitlab_rails']['redis_repository_cache_ssl'] = false
537546
default['gitlab']['gitlab_rails']['redis_repository_cache_tls_ca_cert_dir'] = default['gitlab']['gitlab_rails']['redis_tls_ca_cert_dir'].dup
@@ -543,6 +552,7 @@
543552
default['gitlab']['gitlab_rails']['redis_cluster_rate_limiting_sentinels_password'] = nil
544553
default['gitlab']['gitlab_rails']['redis_cluster_rate_limiting_username'] = nil
545554
default['gitlab']['gitlab_rails']['redis_cluster_rate_limiting_password'] = nil
555+
default['gitlab']['gitlab_rails']['redis_cluster_rate_limiting_encrypted_settings_file'] = nil
546556
default['gitlab']['gitlab_rails']['redis_cluster_rate_limiting_cluster_nodes'] = []
547557
default['gitlab']['gitlab_rails']['redis_cluster_rate_limiting_ssl'] = false
548558
default['gitlab']['gitlab_rails']['redis_cluster_rate_limiting_tls_ca_cert_dir'] = default['gitlab']['gitlab_rails']['redis_tls_ca_cert_dir'].dup

files/gitlab-cookbooks/gitlab/libraries/gitlab_rails.rb

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
require_relative 'nginx.rb'
1818
require_relative '../../gitaly/libraries/gitaly.rb'
1919
require_relative '../../package/libraries/settings_dsl.rb'
20+
require_relative 'redis_helper'
2021

2122
module GitlabRails
2223
ALLOWED_DATABASES = %w[main ci geo embedding].freeze
@@ -323,7 +324,16 @@ def parse_ci_secure_files_dir
323324

324325
def parse_encrypted_settings_path
325326
# This requires the parse_shared_dir to be executed before
326-
Gitlab['gitlab_rails']['encrypted_settings_path'] ||= File.join(Gitlab['gitlab_rails']['shared_path'], 'encrypted_settings')
327+
encrypted_settings_path = Gitlab['gitlab_rails']['encrypted_settings_path'] ||= File.join(Gitlab['gitlab_rails']['shared_path'], 'encrypted_settings')
328+
329+
RedisHelper::REDIS_INSTANCES.each do |instance|
330+
Gitlab['gitlab_rails']["redis_#{instance}_encrypted_settings_file"] ||= Gitlab['gitlab_rails']['redis_encrypted_settings_file'] || File.join(encrypted_settings_path, "redis.#{instance}.yml.enc")
331+
end
332+
333+
# NOTE: The default value of `redis_encrypted_settings_file` should be
334+
# set only after the instance-specific ones are handled, or this default
335+
# value will get used for the instance-specific settings.
336+
Gitlab['gitlab_rails']['redis_encrypted_settings_file'] ||= File.join(encrypted_settings_path, 'redis.yml.enc')
327337
end
328338

329339
def parse_pages_dir

files/gitlab-cookbooks/gitlab/recipes/gitlab-rails.rb

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@
217217
redis_tls_ca_cert_file = node['gitlab']['gitlab_rails']['redis_tls_ca_cert_file']
218218
redis_tls_client_cert_file = node['gitlab']['gitlab_rails']['redis_tls_client_cert_file']
219219
redis_tls_client_key_file = node['gitlab']['gitlab_rails']['redis_tls_client_key_file']
220+
redis_encrypted_settings_file = node['gitlab']['gitlab_rails']['redis_encrypted_settings_file']
220221

221222
templatesymlink "Create a secrets.yml and create a symlink to Rails root" do
222223
link_from File.join(gitlab_rails_source_dir, "config/secrets.yml")
@@ -253,7 +254,8 @@
253254
redis_tls_ca_cert_dir: redis_tls_ca_cert_dir,
254255
redis_tls_ca_cert_file: redis_tls_ca_cert_file,
255256
redis_tls_client_cert_file: redis_tls_client_cert_file,
256-
redis_tls_client_key_file: redis_tls_client_key_file
257+
redis_tls_client_key_file: redis_tls_client_key_file,
258+
redis_encrypted_settings_file: redis_encrypted_settings_file
257259
)
258260
dependent_services.each { |svc| notifies :restart, svc }
259261
sensitive true
@@ -305,6 +307,7 @@
305307
ca_cert_file = node['gitlab']['gitlab_rails']["redis_#{instance}_tls_ca_cert_file"]
306308
certificate_file = node['gitlab']['gitlab_rails']["redis_#{instance}_tls_client_cert_file"]
307309
key_file = node['gitlab']['gitlab_rails']["redis_#{instance}_tls_client_key_file"]
310+
instance_encrypted_settings_file = node['gitlab']['gitlab_rails']["redis_#{instance}_encrypted_settings_file"]
308311
from_filename = File.join(gitlab_rails_source_dir, "config/#{filename}")
309312
to_filename = File.join(gitlab_rails_etc_dir, filename)
310313

@@ -329,7 +332,8 @@
329332
redis_tls_ca_cert_dir: ca_cert_dir,
330333
redis_tls_ca_cert_file: ca_cert_file,
331334
redis_tls_client_cert_file: certificate_file,
332-
redis_tls_client_key_file: key_file
335+
redis_tls_client_key_file: key_file,
336+
redis_encrypted_settings_file: instance_encrypted_settings_file
333337
)
334338
dependent_services.each { |svc| notifies :restart, svc }
335339
action :delete if url.nil? && clusters.empty?

files/gitlab-cookbooks/gitlab/templates/default/resque.yml.erb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ production:
1313
<% end %>
1414
<% else %>
1515
url: <%= @redis_url %>
16+
secret_file: <%= @redis_encrypted_settings_file %>
1617
<%- if @redis_ssl %>
1718
ssl_params:
1819
<%- if @redis_tls_ca_cert_dir %>ca_path: "<%= @redis_tls_ca_cert_dir %>"<% end %>

spec/chef/cookbooks/gitlab/recipes/gitlab-rails_spec.rb

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,8 @@
440440
redis_tls_ca_cert_dir: "/opt/gitlab/embedded/ssl/certs/",
441441
redis_tls_ca_cert_file: "/opt/gitlab/embedded/ssl/certs/cacert.pem",
442442
redis_tls_client_cert_file: nil,
443-
redis_tls_client_key_file: nil
443+
redis_tls_client_key_file: nil,
444+
redis_encrypted_settings_file: "/var/opt/gitlab/gitlab-rails/shared/encrypted_settings/redis.#{instance}.yml.enc"
444445
)
445446

446447
expect(chef_run).to render_file("/var/opt/gitlab/gitlab-rails/etc/redis.#{instance}.yml").with_content { |content|
@@ -482,7 +483,8 @@
482483
redis_tls_ca_cert_dir: "/opt/gitlab/embedded/ssl/certs/",
483484
redis_tls_ca_cert_file: "/opt/gitlab/embedded/ssl/certs/cacert.pem",
484485
redis_tls_client_cert_file: nil,
485-
redis_tls_client_key_file: nil
486+
redis_tls_client_key_file: nil,
487+
redis_encrypted_settings_file: "/var/opt/gitlab/gitlab-rails/shared/encrypted_settings/redis.#{instance}.yml.enc"
486488
)
487489

488490
expect(chef_run).to render_file("/var/opt/gitlab/gitlab-rails/etc/redis.#{instance}.yml").with_content { |content|
@@ -524,7 +526,8 @@
524526
redis_tls_ca_cert_dir: "/opt/gitlab/embedded/ssl/certs/",
525527
redis_tls_ca_cert_file: "/opt/gitlab/embedded/ssl/certs/cacert.pem",
526528
redis_tls_client_cert_file: nil,
527-
redis_tls_client_key_file: nil
529+
redis_tls_client_key_file: nil,
530+
redis_encrypted_settings_file: "/var/opt/gitlab/gitlab-rails/shared/encrypted_settings/redis.#{instance}.yml.enc"
528531
)
529532

530533
expect(chef_run).to render_file("/var/opt/gitlab/gitlab-rails/etc/redis.#{instance}.yml").with_content { |content|
@@ -545,6 +548,42 @@
545548
expect(chef_run).to create_templatesymlink('Create a resque.yml and create a symlink to Rails root')
546549
end
547550
end
551+
552+
describe 'encrypted_settings_file' do
553+
cached(:chef_run) do
554+
ChefSpec::SoloRunner.new(step_into: %w(templatesymlink)).converge('gitlab::default')
555+
end
556+
557+
let(:cache_secret_file) { '/etc/gitlab/cache.redis.enc' }
558+
let(:global_secret_file) { '/etc/gitlab/global.redis.enc' }
559+
560+
context 'with separate file for an instance' do
561+
before do
562+
stub_gitlab_rb(
563+
gitlab_rails: {
564+
redis_encrypted_settings_file: global_secret_file,
565+
redis_cache_instance: 'redis://redis.cache.instance',
566+
redis_cache_encrypted_settings_file: cache_secret_file,
567+
redis_shared_state_instance: 'redis://redis.shared_state.instance'
568+
}
569+
)
570+
end
571+
572+
it 'uses specified path for the cache instance' do
573+
expect(chef_run).to render_file("/var/opt/gitlab/gitlab-rails/etc/redis.cache.yml").with_content { |content|
574+
generated_yml = YAML.safe_load(content)
575+
expect(generated_yml.dig('production', 'secret_file')).to eq(cache_secret_file)
576+
}
577+
end
578+
579+
it 'uses global path for the shared state instance' do
580+
expect(chef_run).to render_file("/var/opt/gitlab/gitlab-rails/etc/redis.shared_state.yml").with_content { |content|
581+
generated_yml = YAML.safe_load(content)
582+
expect(generated_yml.dig('production', 'secret_file')).to eq(global_secret_file)
583+
}
584+
end
585+
end
586+
end
548587
end
549588

550589
context 'redis.yml override' do

0 commit comments

Comments
 (0)