Skip to content

Commit 07dd30c

Browse files
committed
Merge pull request #1 from arschles/remove-etcd-changes
ref(pkg/controller/utils.go,pkg/sshd/sshd.go): send public key fingerprint to the controller
2 parents 3daf28d + b13b3b1 commit 07dd30c

4 files changed

Lines changed: 82 additions & 43 deletions

File tree

pkg/controller/utils.go

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
package controller
22

33
import (
4-
"encoding/base64"
4+
"crypto/md5"
5+
"encoding/hex"
56
"encoding/json"
67
"fmt"
78
"net/http"
89
"os"
910
"strings"
1011

1112
"github.com/deis/builder/pkg/conf"
13+
"golang.org/x/crypto/ssh"
1214
)
1315

1416
const (
@@ -39,9 +41,30 @@ func controllerURLStr(additionalPath ...string) (string, error) {
3941
return fmt.Sprintf("http://%s:%s/%s", host, port, strings.Join(additionalPath, "/")), nil
4042
}
4143

42-
func UserInfoFromKey(key string) (*UserInfo, error) {
43-
keyB64 := base64.RawURLEncoding.EncodeToString([]byte(key))
44-
url, err := controllerURLStr("v2", "hooks", "key", keyB64)
44+
// fingerprint generates a colon-separated fingerprint string from a public key.
45+
func fingerprint(key ssh.PublicKey) string {
46+
hash := md5.Sum(key.Marshal())
47+
buf := make([]byte, hex.EncodedLen(len(hash)))
48+
hex.Encode(buf, hash[:])
49+
// We need this in colon notation:
50+
fp := make([]byte, len(buf)+15)
51+
52+
i, j := 0, 0
53+
for ; i < len(buf); i++ {
54+
if i > 0 && i%2 == 0 {
55+
fp[j] = ':'
56+
j++
57+
}
58+
fp[j] = buf[i]
59+
j++
60+
}
61+
return string(fp)
62+
}
63+
64+
// UserInfoFromKey makes a request to the controller to get the user info from they given key
65+
func UserInfoFromKey(key ssh.PublicKey) (*UserInfo, error) {
66+
fp := fingerprint(key)
67+
url, err := controllerURLStr("v2", "hooks", "key", fp)
4568
if err != nil {
4669
return nil, err
4770
}
@@ -75,5 +98,6 @@ func UserInfoFromKey(key string) (*UserInfo, error) {
7598
if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
7699
return nil, err
77100
}
101+
ret.FingerPrint = fp
78102
return ret, nil
79103
}

pkg/controller/utils_test.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package controller
2+
3+
import (
4+
"testing"
5+
6+
"golang.org/x/crypto/ssh"
7+
)
8+
9+
const (
10+
testingClientKey = `-----BEGIN RSA PRIVATE KEY-----
11+
MIIEowIBAAKCAQEAvziJnoiaaVyUGPnyqVC49XLzNRS+TPW63Nw4qovCG8lVbxKG
12+
DIHC64tJrCDiZd0ppEhY+RQDGaPwrMInHnV8IwdS1wX22UTRuXA/oXmHcIxO2zmU
13+
nrjFDlpKm2o+2Xd167ifdV9AiqNBtquO0M882RaGy99LbNPcl9ugAnxo5DVI1jES
14+
l5vYqtiOAnRSvmJn2c+hkJfKXryH7hU4y+blDK5Vz44eSsC7bgG3ZbKfKGR9mlf2
15+
ozVlzMNi2ACZ58vDBxn5WVLb1bPV1LHpicJ00fU3TDRnK3MkwvvAnqp78bNzi+ou
16+
YIAwYSZ41iHNd596LQJchr1vs3Fo8qbgYaLY8wIDAQABAoIBAEJgQL0ME/Vw0mOd
17+
F5OYVqu0vCF30trqDXQu6Wih3L5Cc+p7Vpau0Fds4STjwVK0o4jIKEJFpRHYa2m8
18+
d1HGXFHYb/P9uQMQNXCWOzA0/EOgIJtOcH1sC9MAmpc6GRjps8AgNRHL/55gLyZW
19+
hNuMpEWC4UWRfCAJpq/7554VS1+zWK0vy1GszikROjsZnopLTshMV+/7217tSk4O
20+
1GY9ucNJX5iX3M83pmBOJX0ce8fqxeNnAdQIaAtp+ytm5TRzyaQtTjMlq0oqP8+7
21+
Zx9aZKT11IpbOKBSIc6twRArlV1dT9kEI15zS9hfbWuvguB0zuhbhejS4wmZb9Tt
22+
X8rGL4ECgYEA+MZcRzxpBKL+VNuQ4iSwF3RUYL1FIglJV7AM8UdM2hiNeiKidhD5
23+
kmNXVf9C6XWg3OIHCno7HetBo0WZIPmOQMy4CDGC2bWEnQN+/bf3xsKzbECCLtH+
24+
DALXSztihGGiY2zSoOCwTe7WZjGaF9s4C2rVkhsU/9di4qbapGTaWMECgYEAxMZD
25+
c/sVTTT+/thdcLbBDhAfy6RMQwAy/1IPxNVR4C4O+l/rspbKxvV7JyaErP66g871
26+
dBwrOGMfEsYoOOsUBFaj2/jJZdHvQj9jY/kdsfMBivHzkWEFte09NROOThbq+sgX
27+
5bIPwS+IcVCgcA4We+aBv+rYKdvk05RJ8owPSrMCgYBjz4H6erxPxe1wsl8gvEOC
28+
RYQNBCMWks9ARTwMGeU1o6AvnnG8GPdoyj6iHDYGYNFXjb/xbjUFvfupvCTB3B48
29+
1WYIs4SiQHeiX2K1/PeGYVuHVSJmEo5w1zr1zi+qmVmDtoeTUFKsEeUnP0NpyuRj
30+
gEuLwR3dv9bGxNb4GhaYgQKBgDNQCFL8TMe/ZCeMwIEeByXlqoTuKTznlmTiP15y
31+
ylENcbZ0wP/nNqW/aggBkWOTYYvxsiw/FD42CupYZjDBjIy9EynPrKUyo5PA9+gg
32+
FFBNMD/NbFii1lxkqytmGBvg+hG/kAvD7TvRa2ExR0UxR0e0Cm3Dje8MepV5+/aV
33+
837lAoGBAPcvnrDFWKUy8dlrw05+9esiuZgCrCzZPw5xIxhrnRPcBOBl+QdpMscP
34+
eWVutcVy5Frxl5tTf71WK/YhGPgWBt/CQz73Bf1+CX80CeApWWAqiAr240NED5a0
35+
dBAFNBWp8IdHnQmdp9HKvxEXSK+RgOzPNLrpaRv+FPuiD6OtvhmD
36+
-----END RSA PRIVATE KEY-----`
37+
testingClientFingerprint = `78:b9:21:20:1a:ed:e6:10:05:35:47:da:d4:1f:b6:73`
38+
)
39+
40+
func sshTestingClientKey() (ssh.Signer, error) {
41+
return ssh.ParsePrivateKey([]byte(testingClientKey))
42+
}
43+
44+
func TestFingerprint(t *testing.T) {
45+
key, _ := sshTestingClientKey()
46+
fp := fingerprint(key.PublicKey())
47+
if fp != testingClientFingerprint {
48+
t.Errorf("Expected fingerprint %s to match %s.", fp, testingClientFingerprint)
49+
}
50+
}

pkg/sshd/server_test.go

Lines changed: 2 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,6 @@ func sshTestingHostKey() (ssh.Signer, error) {
7777
return ssh.ParsePrivateKey([]byte(testingHostKey))
7878
}
7979

80-
func sshTestingClientKey() (ssh.Signer, error) {
81-
return ssh.ParsePrivateKey([]byte(testingClientKey))
82-
}
83-
8480
func runServer(config *ssh.ServerConfig, t *testing.T) cookoo.Context {
8581
reg, router, cxt := cookoo.Cookoo()
8682
cxt.Put(ServerConfig, config)
@@ -158,34 +154,6 @@ v3+ZZfZMlci4pxBtXqrnoyj4uUoqZtR3ENLz53SN1i0vpT7DtC6gMnEF1UWiaoJ6
158154
6mGH5/bxCg9wpV7qpqR0EbFM/dhQFZmmnirOS8x+00hJvc1HFiuN/A==
159155
-----END RSA PRIVATE KEY-----
160156
`
161-
testingClientKey = `-----BEGIN RSA PRIVATE KEY-----
162-
MIIEowIBAAKCAQEAvziJnoiaaVyUGPnyqVC49XLzNRS+TPW63Nw4qovCG8lVbxKG
163-
DIHC64tJrCDiZd0ppEhY+RQDGaPwrMInHnV8IwdS1wX22UTRuXA/oXmHcIxO2zmU
164-
nrjFDlpKm2o+2Xd167ifdV9AiqNBtquO0M882RaGy99LbNPcl9ugAnxo5DVI1jES
165-
l5vYqtiOAnRSvmJn2c+hkJfKXryH7hU4y+blDK5Vz44eSsC7bgG3ZbKfKGR9mlf2
166-
ozVlzMNi2ACZ58vDBxn5WVLb1bPV1LHpicJ00fU3TDRnK3MkwvvAnqp78bNzi+ou
167-
YIAwYSZ41iHNd596LQJchr1vs3Fo8qbgYaLY8wIDAQABAoIBAEJgQL0ME/Vw0mOd
168-
F5OYVqu0vCF30trqDXQu6Wih3L5Cc+p7Vpau0Fds4STjwVK0o4jIKEJFpRHYa2m8
169-
d1HGXFHYb/P9uQMQNXCWOzA0/EOgIJtOcH1sC9MAmpc6GRjps8AgNRHL/55gLyZW
170-
hNuMpEWC4UWRfCAJpq/7554VS1+zWK0vy1GszikROjsZnopLTshMV+/7217tSk4O
171-
1GY9ucNJX5iX3M83pmBOJX0ce8fqxeNnAdQIaAtp+ytm5TRzyaQtTjMlq0oqP8+7
172-
Zx9aZKT11IpbOKBSIc6twRArlV1dT9kEI15zS9hfbWuvguB0zuhbhejS4wmZb9Tt
173-
X8rGL4ECgYEA+MZcRzxpBKL+VNuQ4iSwF3RUYL1FIglJV7AM8UdM2hiNeiKidhD5
174-
kmNXVf9C6XWg3OIHCno7HetBo0WZIPmOQMy4CDGC2bWEnQN+/bf3xsKzbECCLtH+
175-
DALXSztihGGiY2zSoOCwTe7WZjGaF9s4C2rVkhsU/9di4qbapGTaWMECgYEAxMZD
176-
c/sVTTT+/thdcLbBDhAfy6RMQwAy/1IPxNVR4C4O+l/rspbKxvV7JyaErP66g871
177-
dBwrOGMfEsYoOOsUBFaj2/jJZdHvQj9jY/kdsfMBivHzkWEFte09NROOThbq+sgX
178-
5bIPwS+IcVCgcA4We+aBv+rYKdvk05RJ8owPSrMCgYBjz4H6erxPxe1wsl8gvEOC
179-
RYQNBCMWks9ARTwMGeU1o6AvnnG8GPdoyj6iHDYGYNFXjb/xbjUFvfupvCTB3B48
180-
1WYIs4SiQHeiX2K1/PeGYVuHVSJmEo5w1zr1zi+qmVmDtoeTUFKsEeUnP0NpyuRj
181-
gEuLwR3dv9bGxNb4GhaYgQKBgDNQCFL8TMe/ZCeMwIEeByXlqoTuKTznlmTiP15y
182-
ylENcbZ0wP/nNqW/aggBkWOTYYvxsiw/FD42CupYZjDBjIy9EynPrKUyo5PA9+gg
183-
FFBNMD/NbFii1lxkqytmGBvg+hG/kAvD7TvRa2ExR0UxR0e0Cm3Dje8MepV5+/aV
184-
837lAoGBAPcvnrDFWKUy8dlrw05+9esiuZgCrCzZPw5xIxhrnRPcBOBl+QdpMscP
185-
eWVutcVy5Frxl5tTf71WK/YhGPgWBt/CQz73Bf1+CX80CeApWWAqiAr240NED5a0
186-
dBAFNBWp8IdHnQmdp9HKvxEXSK+RgOzPNLrpaRv+FPuiD6OtvhmD
187-
-----END RSA PRIVATE KEY-----`
188-
189-
testingClientPubKey = `ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/OImeiJppXJQY+fKpULj1cvM1FL5M9brc3Diqi8IbyVVvEoYMgcLri0msIOJl3SmkSFj5FAMZo/CswicedXwjB1LXBfbZRNG5cD+heYdwjE7bOZSeuMUOWkqbaj7Zd3XruJ91X0CKo0G2q47QzzzZFobL30ts09yX26ACfGjkNUjWMRKXm9iq2I4CdFK+YmfZz6GQl8pevIfuFTjL5uUMrlXPjh5KwLtuAbdlsp8oZH2aV/ajNWXMw2LYAJnny8MHGflZUtvVs9XUsemJwnTR9TdMNGcrcyTC+8Ceqnvxs3OL6i5ggDBhJnjWIc13n3otAlyGvW+zcWjypuBhotjz donotuse`
190-
testingClientFingerprint = `78:b9:21:20:1a:ed:e6:10:05:35:47:da:d4:1f:b6:73`
157+
158+
testingClientPubKey = `ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/OImeiJppXJQY+fKpULj1cvM1FL5M9brc3Diqi8IbyVVvEoYMgcLri0msIOJl3SmkSFj5FAMZo/CswicedXwjB1LXBfbZRNG5cD+heYdwjE7bOZSeuMUOWkqbaj7Zd3XruJ91X0CKo0G2q47QzzzZFobL30ts09yX26ACfGjkNUjWMRKXm9iq2I4CdFK+YmfZz6GQl8pevIfuFTjL5uUMrlXPjh5KwLtuAbdlsp8oZH2aV/ajNWXMw2LYAJnny8MHGflZUtvVs9XUsemJwnTR9TdMNGcrcyTC+8Ceqnvxs3OL6i5ggDBhJnjWIc13n3otAlyGvW+zcWjypuBhotjz donotuse`
191159
)

pkg/sshd/sshd.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,15 +71,12 @@ func ParseHostKeys(c cookoo.Context, p *cookoo.Params) (interface{}, cookoo.Inte
7171
func AuthKey(c cookoo.Context, p *cookoo.Params) (interface{}, cookoo.Interrupt) {
7272
log.Debugf(c, "Starting ssh authentication")
7373
key := p.Get("key", nil).(ssh.PublicKey)
74-
75-
strKey := string(ssh.MarshalAuthorizedKey(key))
76-
log.Debugf(c, "Checking auth for user key %v", strKey)
77-
userInfo, err := controller.UserInfoFromKey(strKey)
74+
userInfo, err := controller.UserInfoFromKey(key)
7875
if err != nil {
7976
return nil, err
8077
}
8178

82-
userInfo.Key = strKey
79+
userInfo.Key = string(ssh.MarshalAuthorizedKey(key))
8380
c.Put("userinfo", userInfo)
8481

8582
log.Infof(c, "Key accepted for user %s.", userInfo.Username)

0 commit comments

Comments
 (0)