Skip to content

Commit

Permalink
Send passwords via environment variables
Browse files Browse the repository at this point in the history
When passing secrets via the command line, they are visible in the
process list. Regardless of how brief that is, it is a security issue
because non-privileged users can read them.

This passes them in via environment variables, which on the supported
operating systems can be considered safe.
  • Loading branch information
ekohl committed Aug 19, 2024
1 parent 6e1c856 commit 25df787
Show file tree
Hide file tree
Showing 6 changed files with 58 additions and 30 deletions.
9 changes: 7 additions & 2 deletions lib/puppet/provider/x509_cert/openssl.rb
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ def exists?
end

def create
env = {}

if resource[:csr]
options = [
'x509',
Expand Down Expand Up @@ -92,9 +94,12 @@ def create

password = resource[:cakey_password] || resource[:password]

options << ['-passin', "pass:#{password}"] if password
if password
options << ['-passin', 'env:CERTIFICATE_PASSIN']
env['CERTIFICATE_PASSIN'] = password
end
options << ['-extensions', 'v3_req'] if resource[:req_ext] != :false
openssl options
openssl options, environment: env
end

def destroy
Expand Down
8 changes: 6 additions & 2 deletions lib/puppet/provider/x509_request/openssl.rb
Original file line number Diff line number Diff line change
Expand Up @@ -28,17 +28,21 @@ def exists?
end

def create
env = {}
options = [
'req', '-new',
'-key', resource[:private_key],
'-config', resource[:template],
'-out', resource[:path]
]

options << ['-passin', "pass:#{resource[:password]}"] if resource[:password]
if resource[:password]
options << ['-passin', 'env:CERTIFICATE_PASSIN']
env['CERTIFICATE_PASSIN'] = resource[:password]
end
options << ['-nodes'] unless resource[:encrypted]

openssl options
openssl options, environment: env
end

def destroy
Expand Down
16 changes: 10 additions & 6 deletions manifests/export/pem_cert.pp
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,12 @@
$in_cert = $pfx_cert
}

$passin_opt = $in_pass ? {
undef => [],
default => ['-nokeys', '-passin', "pass:${in_pass}"],
if $in_pass {
$passin_opt = ['-nokeys', '-passin', 'env:CERTIFICATE_PASSIN']
$passin_env = ["CERTIFICATE_PASSIN=${in_pass}"]
} else {
$passin_opt = []
$passin_env = []
}

if $ensure == 'present' {
Expand All @@ -62,9 +65,10 @@
}

exec { "Export ${in_cert} to ${pem_cert}":
command => $cmd,
path => $facts['path'],
* => $exec_params,
command => $cmd,
environment => $passin_env
path => $facts['path'],
* => $exec_params,
}
} else {
file { $pem_cert:
Expand Down
25 changes: 16 additions & 9 deletions manifests/export/pem_key.pp
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,20 @@
Optional[String] $out_pass = undef,
) {
if $ensure == 'present' {
$passin_opt = $in_pass ? {
undef => [],
default => ['-passin', "pass:${in_pass}"],
if $in_pass {
$passin_opt = ['-nokeys', '-passin', 'env:CERTIFICATE_PASSIN']
$passin_env = ["CERTIFICATE_PASSIN=${in_pass}"]
} else {
$passin_opt = []
$passin_env = []
}

$passout_opt = $out_pass ? {
undef => ['-nodes'],
default => ['-passout', "pass:${out_pass}"],
if $out_pass {
$passout_opt = ['-nokeys', '-passout', 'env:CERTIFICATE_PASSOUT']
$passout_env = ["CERTIFICATE_PASSOUT=${out_pass}"]
} else {
$passout_opt = []
$passout_env = []
}

$cmd = [
Expand All @@ -52,9 +58,10 @@
}

exec { "Export ${pfx_cert} to ${pem_key}":
command => $cmd,
path => $facts['path'],
* => $exec_params,
command => $cmd,
environment => $passin_env + $passout_env,
path => $facts['path'],
* => $exec_params,
}
} else {
file { $pem_key:
Expand Down
27 changes: 17 additions & 10 deletions manifests/export/pkcs12.pp
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,20 @@
$full_path = "${basedir}/${name}.p12"

if $ensure == 'present' {
$pass_opt = $in_pass ? {
undef => [],
default => ['-passin', "pass:${in_pass}"],
if $in_pass {
$passin_opt = ['-nokeys', '-passin', 'env:CERTIFICATE_PASSIN']
$passin_env = ["CERTIFICATE_PASSIN=${in_pass}"]
} else {
$passin_opt = []
$passin_env = []
}

$passout_opt = $out_pass ? {
undef => [],
default => ['-passout', "pass:${out_pass}"],
if $out_pass {
$passout_opt = ['-nokeys', '-passout', 'env:CERTIFICATE_PASSOUT']
$passout_env = ["CERTIFICATE_PASSOUT=${out_pass}"]
} else {
$passout_opt = []
$passout_env = []
}

$chain_opt = $chaincert ? {
Expand All @@ -55,7 +61,7 @@
'-out', $full_path,
'-name', $name,
'-nodes', '-noiter',
] + $chain_opt + $pass_opt + $passout_opt
] + $chain_opt + $passin_opt + $passout_opt

if $dynamic {
$exec_params = {
Expand All @@ -67,9 +73,10 @@
}

exec { "Export ${name} to ${full_path}":
command => $cmd,
path => $facts['path'],
* => $exec_params,
command => $cmd,
environment => $passin_env + $passout_env,
path => $facts['path'],
* => $exec_params,
}
} else {
file { $full_path:
Expand Down
3 changes: 2 additions & 1 deletion spec/defines/openssl_export_pem_cert_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,8 @@

it {
is_expected.to contain_exec('Export /etc/ssl/certs/foo.pfx to /etc/ssl/certs/foo.pem').with(
command: ['openssl', 'pkcs12', '-in', '/etc/ssl/certs/foo.pfx', '-out', '/etc/ssl/certs/foo.pem', '-nokeys', '-passin', 'pass:5r$}^'],
command: ['openssl', 'pkcs12', '-in', '/etc/ssl/certs/foo.pfx', '-out', '/etc/ssl/certs/foo.pem', '-nokeys', '-passin', 'env:CERTIFICATE_PASSIN'],
environment: ['CERTIFICATE_PASSIN=5r$}^'],
creates: '/etc/ssl/certs/foo.pem',
path: '/usr/bin:/bin:/usr/sbin:/sbin'
)
Expand Down

0 comments on commit 25df787

Please sign in to comment.