forked from TrueCloudLab/certificates
Use an actual Hosts type when returning ssh hosts
This commit is contained in:
parent
50188fc901
commit
656f35e522
5 changed files with 29 additions and 6 deletions
|
@ -10,6 +10,7 @@ import (
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/smallstep/certificates/authority"
|
"github.com/smallstep/certificates/authority"
|
||||||
"github.com/smallstep/certificates/authority/provisioner"
|
"github.com/smallstep/certificates/authority/provisioner"
|
||||||
|
"github.com/smallstep/certificates/sshutil"
|
||||||
"github.com/smallstep/certificates/templates"
|
"github.com/smallstep/certificates/templates"
|
||||||
"golang.org/x/crypto/ssh"
|
"golang.org/x/crypto/ssh"
|
||||||
)
|
)
|
||||||
|
@ -24,7 +25,7 @@ type SSHAuthority interface {
|
||||||
GetSSHFederation() (*authority.SSHKeys, error)
|
GetSSHFederation() (*authority.SSHKeys, error)
|
||||||
GetSSHConfig(typ string, data map[string]string) ([]templates.Output, error)
|
GetSSHConfig(typ string, data map[string]string) ([]templates.Output, error)
|
||||||
CheckSSHHost(principal string) (bool, error)
|
CheckSSHHost(principal string) (bool, error)
|
||||||
GetSSHHosts(cert *x509.Certificate) ([]string, error)
|
GetSSHHosts(cert *x509.Certificate) ([]sshutil.Host, error)
|
||||||
GetSSHBastion(user string, hostname string) (*authority.Bastion, error)
|
GetSSHBastion(user string, hostname string) (*authority.Bastion, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -83,7 +84,7 @@ type SSHCertificate struct {
|
||||||
// SSHGetHostsResponse is the response object that returns the list of valid
|
// SSHGetHostsResponse is the response object that returns the list of valid
|
||||||
// hosts for SSH.
|
// hosts for SSH.
|
||||||
type SSHGetHostsResponse struct {
|
type SSHGetHostsResponse struct {
|
||||||
Hosts []string `json:"hosts"`
|
Hosts []sshutil.Host `json:"hosts"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalJSON implements the json.Marshaler interface. Returns a quoted,
|
// MarshalJSON implements the json.Marshaler interface. Returns a quoted,
|
||||||
|
|
|
@ -11,6 +11,7 @@ import (
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/smallstep/certificates/authority/provisioner"
|
"github.com/smallstep/certificates/authority/provisioner"
|
||||||
"github.com/smallstep/certificates/db"
|
"github.com/smallstep/certificates/db"
|
||||||
|
"github.com/smallstep/certificates/sshutil"
|
||||||
"github.com/smallstep/certificates/templates"
|
"github.com/smallstep/certificates/templates"
|
||||||
"github.com/smallstep/cli/crypto/pemutil"
|
"github.com/smallstep/cli/crypto/pemutil"
|
||||||
"github.com/smallstep/cli/crypto/x509util"
|
"github.com/smallstep/cli/crypto/x509util"
|
||||||
|
@ -40,7 +41,7 @@ type Authority struct {
|
||||||
initOnce bool
|
initOnce bool
|
||||||
// Custom functions
|
// Custom functions
|
||||||
sshBastionFunc func(user, hostname string) (*Bastion, error)
|
sshBastionFunc func(user, hostname string) (*Bastion, error)
|
||||||
sshGetHostsFunc func(cert *x509.Certificate) ([]string, error)
|
sshGetHostsFunc func(cert *x509.Certificate) ([]sshutil.Host, error)
|
||||||
getIdentityFunc provisioner.GetIdentityFunc
|
getIdentityFunc provisioner.GetIdentityFunc
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@ import (
|
||||||
|
|
||||||
"github.com/smallstep/certificates/authority/provisioner"
|
"github.com/smallstep/certificates/authority/provisioner"
|
||||||
"github.com/smallstep/certificates/db"
|
"github.com/smallstep/certificates/db"
|
||||||
|
"github.com/smallstep/certificates/sshutil"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Option sets options to the Authority.
|
// Option sets options to the Authority.
|
||||||
|
@ -36,7 +37,7 @@ func WithSSHBastionFunc(fn func(user, host string) (*Bastion, error)) Option {
|
||||||
|
|
||||||
// WithSSHGetHosts sets a custom function to get the bastion for a
|
// WithSSHGetHosts sets a custom function to get the bastion for a
|
||||||
// given user-host pair.
|
// given user-host pair.
|
||||||
func WithSSHGetHosts(fn func(cert *x509.Certificate) ([]string, error)) Option {
|
func WithSSHGetHosts(fn func(cert *x509.Certificate) ([]sshutil.Host, error)) Option {
|
||||||
return func(a *Authority) {
|
return func(a *Authority) {
|
||||||
a.sshGetHostsFunc = fn
|
a.sshGetHostsFunc = fn
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@ import (
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/smallstep/certificates/authority/provisioner"
|
"github.com/smallstep/certificates/authority/provisioner"
|
||||||
"github.com/smallstep/certificates/db"
|
"github.com/smallstep/certificates/db"
|
||||||
|
"github.com/smallstep/certificates/sshutil"
|
||||||
"github.com/smallstep/certificates/templates"
|
"github.com/smallstep/certificates/templates"
|
||||||
"github.com/smallstep/cli/crypto/randutil"
|
"github.com/smallstep/cli/crypto/randutil"
|
||||||
"github.com/smallstep/cli/jose"
|
"github.com/smallstep/cli/jose"
|
||||||
|
@ -674,17 +675,22 @@ func (a *Authority) CheckSSHHost(principal string) (bool, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetSSHHosts returns a list of valid host principals.
|
// GetSSHHosts returns a list of valid host principals.
|
||||||
func (a *Authority) GetSSHHosts(cert *x509.Certificate) ([]string, error) {
|
func (a *Authority) GetSSHHosts(cert *x509.Certificate) ([]sshutil.Host, error) {
|
||||||
if a.sshGetHostsFunc != nil {
|
if a.sshGetHostsFunc != nil {
|
||||||
return a.sshGetHostsFunc(cert)
|
return a.sshGetHostsFunc(cert)
|
||||||
}
|
}
|
||||||
hosts, err := a.db.GetSSHHostPrincipals()
|
hostnames, err := a.db.GetSSHHostPrincipals()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, &apiError{
|
return nil, &apiError{
|
||||||
err: errors.Wrap(err, "getSSHHosts"),
|
err: errors.Wrap(err, "getSSHHosts"),
|
||||||
code: http.StatusInternalServerError,
|
code: http.StatusInternalServerError,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hosts := make([]sshutil.Host, len(hostnames))
|
||||||
|
for i, hn := range hostnames {
|
||||||
|
hosts[i] = sshutil.Host{Hostname: hn}
|
||||||
|
}
|
||||||
return hosts, nil
|
return hosts, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
14
sshutil/types.go
Normal file
14
sshutil/types.go
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
package sshutil
|
||||||
|
|
||||||
|
// HostGroup defines expected attributes for a host group that a host might belong to.
|
||||||
|
type HostGroup struct {
|
||||||
|
ID string
|
||||||
|
Name string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Host defines expected attributes for an ssh host.
|
||||||
|
type Host struct {
|
||||||
|
HostID string `json:"hid"`
|
||||||
|
HostGroups []HostGroup `json:"host_groups"`
|
||||||
|
Hostname string `json:"hostname"`
|
||||||
|
}
|
Loading…
Reference in a new issue