summaryrefslogtreecommitdiff
path: root/internal/ssh/server
diff options
context:
space:
mode:
authorPaul Bütow <pbuetow@mimecast.com>2020-01-20 18:41:05 +0000
committerPaul Bütow <pbuetow@mimecast.com>2020-01-21 14:35:23 +0000
commitc128865c4c7411c29a59fca9a3a2f95537686d7b (patch)
tree193bccc70d942c8b70cc93fae2670263701e43aa /internal/ssh/server
parent3755a9911ecb05886577095f2b8cc8b9e4066a3a (diff)
Move commands to cmd/ and move internal dependencies to internal/
Diffstat (limited to 'internal/ssh/server')
-rw-r--r--internal/ssh/server/hostkey.go37
-rw-r--r--internal/ssh/server/publickeycallback.go62
2 files changed, 99 insertions, 0 deletions
diff --git a/internal/ssh/server/hostkey.go b/internal/ssh/server/hostkey.go
new file mode 100644
index 0000000..7baa4aa
--- /dev/null
+++ b/internal/ssh/server/hostkey.go
@@ -0,0 +1,37 @@
+package server
+
+import (
+ "github.com/mimecast/dtail/internal/config"
+ "github.com/mimecast/dtail/internal/logger"
+ "github.com/mimecast/dtail/internal/ssh"
+ "io/ioutil"
+ "os"
+)
+
+// PrivateHostKey retrieves the private server RSA host key.
+func PrivateHostKey() []byte {
+ hostKeyFile := config.Server.HostKeyFile
+ _, err := os.Stat(hostKeyFile)
+
+ if os.IsNotExist(err) {
+ logger.Info("Generating private server RSA host key")
+ privateKey, err := ssh.GeneratePrivateRSAKey(config.Server.HostKeyBits)
+
+ if err != nil {
+ logger.FatalExit("Failed to generate private server RSA host key", err)
+ }
+
+ pem := ssh.EncodePrivateKeyToPEM(privateKey)
+ if err := ioutil.WriteFile(hostKeyFile, pem, 0600); err != nil {
+ logger.Error("Unable to write private server RSA host key to file", hostKeyFile, err)
+ }
+ return pem
+ }
+
+ logger.Info("Reading private server RSA host key from file", hostKeyFile)
+ pem, err := ioutil.ReadFile(hostKeyFile)
+ if err != nil {
+ logger.FatalExit("Failed to load private server RSA host key", err)
+ }
+ return pem
+}
diff --git a/internal/ssh/server/publickeycallback.go b/internal/ssh/server/publickeycallback.go
new file mode 100644
index 0000000..c6929d7
--- /dev/null
+++ b/internal/ssh/server/publickeycallback.go
@@ -0,0 +1,62 @@
+package server
+
+import (
+ "fmt"
+ "io/ioutil"
+ "os"
+ osUser "os/user"
+
+ "github.com/mimecast/dtail/internal/config"
+ "github.com/mimecast/dtail/internal/logger"
+ user "github.com/mimecast/dtail/internal/user/server"
+
+ gossh "golang.org/x/crypto/ssh"
+)
+
+// PublicKeyCallback is for the server to check whether a public SSH key is authorized ot not.
+func PublicKeyCallback(c gossh.ConnMetadata, pubKey gossh.PublicKey) (*gossh.Permissions, error) {
+ user := user.New(c.User(), c.RemoteAddr().String())
+ logger.Info(user, "Incoming authorization")
+
+ cwd, err := os.Getwd()
+ if err != nil {
+ return nil, fmt.Errorf("Unable to get current working directory|%s|", err.Error())
+ }
+
+ authorizedKeysFile := fmt.Sprintf("%s/%s/%s.authorized_keys", cwd, config.Common.CacheDir, user.Name)
+ if _, err := os.Stat(authorizedKeysFile); os.IsNotExist(err) {
+ user, err := osUser.Lookup(user.Name)
+ if err != nil {
+ return nil, fmt.Errorf("Unable to authorize|%s|%s|", user, err.Error())
+ }
+ // Fallback to ~
+ authorizedKeysFile = user.HomeDir + "/.ssh/authorized_keys"
+ }
+
+ logger.Info(user, "Reading", authorizedKeysFile)
+ authorizedKeysBytes, err := ioutil.ReadFile(authorizedKeysFile)
+ if err != nil {
+ return nil, fmt.Errorf("Unable to read authorized keys file|%s|%s|%s", authorizedKeysFile, user, err.Error())
+ }
+
+ authorizedKeysMap := map[string]bool{}
+ for len(authorizedKeysBytes) > 0 {
+ pubKey, _, _, rest, err := gossh.ParseAuthorizedKey(authorizedKeysBytes)
+ if err != nil {
+ return nil, fmt.Errorf("Unable to parse authorized keys bytes|%s|%s", user, err.Error())
+ }
+ authorizedKeysMap[string(pubKey.Marshal())] = true
+ authorizedKeysBytes = rest
+ }
+
+ if authorizedKeysMap[string(pubKey.Marshal())] {
+ logger.Debug("Public key fingerprint", gossh.FingerprintSHA256(pubKey), user)
+ return &gossh.Permissions{
+ Extensions: map[string]string{
+ "pubkey-fp": gossh.FingerprintSHA256(pubKey),
+ },
+ }, nil
+ }
+
+ return nil, fmt.Errorf("Unknown public key|%s", user)
+}