2019-10-04 02:03:38 +00:00
|
|
|
package templates
|
|
|
|
|
|
|
|
import (
|
|
|
|
"golang.org/x/crypto/ssh"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Step represents the default variables available in the CA.
|
|
|
|
type Step struct {
|
|
|
|
SSH StepSSH
|
|
|
|
}
|
|
|
|
|
2020-02-07 19:42:56 +00:00
|
|
|
// StepSSH holds SSH-related values for the CA.
|
2019-10-04 02:03:38 +00:00
|
|
|
type StepSSH struct {
|
2019-10-12 02:26:59 +00:00
|
|
|
HostKey ssh.PublicKey
|
|
|
|
UserKey ssh.PublicKey
|
|
|
|
HostFederatedKeys []ssh.PublicKey
|
|
|
|
UserFederatedKeys []ssh.PublicKey
|
2019-10-04 02:03:38 +00:00
|
|
|
}
|
2020-06-17 00:24:47 +00:00
|
|
|
|
|
|
|
// DefaultSSHTemplates contains the configuration of default templates used on ssh.
|
|
|
|
// Relative paths are relative to the StepPath.
|
|
|
|
var DefaultSSHTemplates = SSHTemplates{
|
|
|
|
User: []Template{
|
|
|
|
{
|
|
|
|
Name: "include.tpl",
|
2021-11-10 01:25:03 +00:00
|
|
|
Type: Fragment,
|
2020-06-17 00:24:47 +00:00
|
|
|
TemplatePath: "templates/ssh/include.tpl",
|
|
|
|
Path: "~/.ssh/config",
|
|
|
|
Comment: "#",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Name: "config.tpl",
|
|
|
|
Type: File,
|
|
|
|
TemplatePath: "templates/ssh/config.tpl",
|
|
|
|
Path: "ssh/config",
|
|
|
|
Comment: "#",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Name: "known_hosts.tpl",
|
|
|
|
Type: File,
|
|
|
|
TemplatePath: "templates/ssh/known_hosts.tpl",
|
|
|
|
Path: "ssh/known_hosts",
|
|
|
|
Comment: "#",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Host: []Template{
|
|
|
|
{
|
|
|
|
Name: "sshd_config.tpl",
|
|
|
|
Type: Snippet,
|
|
|
|
TemplatePath: "templates/ssh/sshd_config.tpl",
|
|
|
|
Path: "/etc/ssh/sshd_config",
|
|
|
|
Comment: "#",
|
|
|
|
RequiredData: []string{"Certificate", "Key"},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Name: "ca.tpl",
|
|
|
|
Type: Snippet,
|
|
|
|
TemplatePath: "templates/ssh/ca.tpl",
|
|
|
|
Path: "/etc/ssh/ca.pub",
|
|
|
|
Comment: "#",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
// DefaultSSHTemplateData contains the data of the default templates used on ssh.
|
|
|
|
var DefaultSSHTemplateData = map[string]string{
|
|
|
|
// include.tpl adds the step ssh config file.
|
|
|
|
//
|
|
|
|
// Note: on windows `Include C:\...` is treated as a relative path.
|
2021-11-09 23:26:34 +00:00
|
|
|
"include.tpl": `{{- if .User.Authority }}# {{ .User.Authority }}
|
|
|
|
{{ end }}# autogenerated by step
|
|
|
|
# @ {{ now }}
|
|
|
|
Host *
|
2020-06-17 00:24:47 +00:00
|
|
|
{{- if or .User.GOOS "none" | eq "windows" }}
|
|
|
|
Include "{{ .User.StepPath | replace "\\" "/" | trimPrefix "C:" }}/ssh/config"
|
|
|
|
{{- else }}
|
|
|
|
Include "{{.User.StepPath}}/ssh/config"
|
2021-11-09 23:26:34 +00:00
|
|
|
{{ end }}# end`,
|
2020-06-17 00:24:47 +00:00
|
|
|
|
|
|
|
// config.tpl is the step ssh config file, it includes the Match rule and
|
|
|
|
// references the step known_hosts file.
|
|
|
|
//
|
|
|
|
// Note: on windows ProxyCommand requires the full path
|
2021-11-09 23:26:34 +00:00
|
|
|
"config.tpl": `Match exec "step ssh{{- if .User.Context }} --context {{ .User.Context }}{{- end }} check-host %h"
|
2020-06-17 00:24:47 +00:00
|
|
|
{{- if .User.User }}
|
|
|
|
User {{.User.User}}
|
|
|
|
{{- end }}
|
|
|
|
{{- if or .User.GOOS "none" | eq "windows" }}
|
|
|
|
UserKnownHostsFile "{{.User.StepPath}}\ssh\known_hosts"
|
|
|
|
ProxyCommand C:\Windows\System32\cmd.exe /c step ssh proxycommand %r %h %p
|
|
|
|
{{- else }}
|
|
|
|
UserKnownHostsFile "{{.User.StepPath}}/ssh/known_hosts"
|
|
|
|
ProxyCommand step ssh proxycommand %r %h %p
|
|
|
|
{{- end }}
|
|
|
|
`,
|
|
|
|
|
|
|
|
// known_hosts.tpl authorizes the ssh hosts key
|
|
|
|
"known_hosts.tpl": `@cert-authority * {{.Step.SSH.HostKey.Type}} {{.Step.SSH.HostKey.Marshal | toString | b64enc}}
|
|
|
|
{{- range .Step.SSH.HostFederatedKeys}}
|
|
|
|
@cert-authority * {{.Type}} {{.Marshal | toString | b64enc}}
|
|
|
|
{{- end }}
|
|
|
|
`,
|
|
|
|
|
|
|
|
// sshd_config.tpl adds the configuration to support certificates
|
2021-04-13 01:37:10 +00:00
|
|
|
"sshd_config.tpl": `Match all
|
|
|
|
TrustedUserCAKeys /etc/ssh/ca.pub
|
|
|
|
HostCertificate /etc/ssh/{{.User.Certificate}}
|
|
|
|
HostKey /etc/ssh/{{.User.Key}}`,
|
2020-06-17 00:24:47 +00:00
|
|
|
|
|
|
|
// ca.tpl contains the public key used to authorized clients
|
|
|
|
"ca.tpl": `{{.Step.SSH.UserKey.Type}} {{.Step.SSH.UserKey.Marshal | toString | b64enc}}
|
|
|
|
{{- range .Step.SSH.UserFederatedKeys}}
|
|
|
|
{{.Type}} {{.Marshal | toString | b64enc}}
|
|
|
|
{{- end }}
|
|
|
|
`,
|
|
|
|
}
|
|
|
|
|
|
|
|
// DefaultTemplates returns the default templates.
|
|
|
|
func DefaultTemplates() *Templates {
|
|
|
|
sshTemplates := DefaultSSHTemplates
|
|
|
|
for i, t := range sshTemplates.User {
|
2020-06-17 00:56:22 +00:00
|
|
|
sshTemplates.User[i].TemplatePath = ""
|
2020-06-17 00:24:47 +00:00
|
|
|
sshTemplates.User[i].Content = []byte(DefaultSSHTemplateData[t.Name])
|
|
|
|
}
|
|
|
|
for i, t := range sshTemplates.Host {
|
2020-06-17 00:56:22 +00:00
|
|
|
sshTemplates.Host[i].TemplatePath = ""
|
2020-06-17 00:24:47 +00:00
|
|
|
sshTemplates.Host[i].Content = []byte(DefaultSSHTemplateData[t.Name])
|
|
|
|
}
|
|
|
|
return &Templates{
|
|
|
|
SSH: &sshTemplates,
|
|
|
|
Data: map[string]interface{}{},
|
|
|
|
}
|
|
|
|
}
|