in internal/sshd/server_config.go [213:265]
func (s *serverConfig) get(parentCtx context.Context) *ssh.ServerConfig {
var gssapiWithMICConfig *ssh.GSSAPIWithMICConfig
if s.cfg.Server.GSSAPI.Enabled {
gssAPIServer, _ := NewGSSAPIServer(&s.cfg.Server.GSSAPI)
if gssAPIServer != nil {
gssapiWithMICConfig = &ssh.GSSAPIWithMICConfig{
AllowLogin: func(conn ssh.ConnMetadata, srcName string) (*ssh.Permissions, error) {
if conn.User() != s.cfg.User {
return nil, fmt.Errorf("unknown user")
}
return &ssh.Permissions{
// Record the Kerberos principal used for authentication.
Extensions: map[string]string{
"krb5principal": srcName,
},
}, nil
},
Server: gssAPIServer,
}
}
}
sshCfg := &ssh.ServerConfig{
PublicKeyCallback: func(conn ssh.ConnMetadata, key ssh.PublicKey) (*ssh.Permissions, error) {
ctx, cancel := context.WithTimeout(parentCtx, 10*time.Second)
defer cancel()
log.WithContextFields(ctx, log.Fields{"ssh_key_type": key.Type()}).Info("public key authentication")
cert, ok := key.(*ssh.Certificate)
if ok {
return s.handleUserCertificate(ctx, conn.User(), cert)
}
return s.handleUserKey(ctx, conn.User(), key)
},
GSSAPIWithMICConfig: gssapiWithMICConfig,
ServerVersion: "SSH-2.0-GitLab-SSHD",
}
s.configureMACs(sshCfg)
s.configureKeyExchanges(sshCfg)
s.configureCiphers(sshCfg)
s.configurePublicKeyAlgorithms(sshCfg)
for _, key := range s.hostKeys {
sshCfg.AddHostKey(key)
}
return sshCfg
}