encryption.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. package overlay
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "encoding/hex"
  6. "fmt"
  7. "hash/fnv"
  8. "net"
  9. "sync"
  10. "github.com/Sirupsen/logrus"
  11. "github.com/docker/libnetwork/types"
  12. )
  13. const (
  14. mark = uint32(0xD0C4E3)
  15. timeout = 30
  16. pktExpansion = 26 // SPI(4) + SeqN(4) + IV(8) + PadLength(1) + NextHeader(1) + ICV(8)
  17. )
  18. const (
  19. forward = iota + 1
  20. reverse
  21. bidir
  22. )
  23. type key struct {
  24. value []byte
  25. tag uint32
  26. }
  27. func (k *key) String() string {
  28. if k != nil {
  29. return fmt.Sprintf("(key: %s, tag: 0x%x)", hex.EncodeToString(k.value)[0:5], k.tag)
  30. }
  31. return ""
  32. }
  33. type spi struct {
  34. forward int
  35. reverse int
  36. }
  37. func (s *spi) String() string {
  38. return fmt.Sprintf("SPI(FWD: 0x%x, REV: 0x%x)", uint32(s.forward), uint32(s.reverse))
  39. }
  40. type encrMap struct {
  41. nodes map[string][]*spi
  42. sync.Mutex
  43. }
  44. func (e *encrMap) String() string {
  45. e.Lock()
  46. defer e.Unlock()
  47. b := new(bytes.Buffer)
  48. for k, v := range e.nodes {
  49. b.WriteString("\n")
  50. b.WriteString(k)
  51. b.WriteString(":")
  52. b.WriteString("[")
  53. for _, s := range v {
  54. b.WriteString(s.String())
  55. b.WriteString(",")
  56. }
  57. b.WriteString("]")
  58. }
  59. return b.String()
  60. }
  61. func (d *driver) checkEncryption(nid string, rIP net.IP, vxlanID uint32, isLocal, add bool) error {
  62. logrus.Debugf("checkEncryption(%s, %v, %d, %t)", nid[0:7], rIP, vxlanID, isLocal)
  63. n := d.network(nid)
  64. if n == nil || !n.secure {
  65. return nil
  66. }
  67. if len(d.keys) == 0 {
  68. return types.ForbiddenErrorf("encryption key is not present")
  69. }
  70. lIP := net.ParseIP(d.bindAddress)
  71. aIP := net.ParseIP(d.advertiseAddress)
  72. nodes := map[string]net.IP{}
  73. switch {
  74. case isLocal:
  75. if err := d.peerDbNetworkWalk(nid, func(pKey *peerKey, pEntry *peerEntry) bool {
  76. if !aIP.Equal(pEntry.vtep) {
  77. nodes[pEntry.vtep.String()] = pEntry.vtep
  78. }
  79. return false
  80. }); err != nil {
  81. logrus.Warnf("Failed to retrieve list of participating nodes in overlay network %s: %v", nid[0:5], err)
  82. }
  83. default:
  84. if len(d.network(nid).endpoints) > 0 {
  85. nodes[rIP.String()] = rIP
  86. }
  87. }
  88. logrus.Debugf("List of nodes: %s", nodes)
  89. if add {
  90. for _, rIP := range nodes {
  91. if err := setupEncryption(lIP, aIP, rIP, vxlanID, d.secMap, d.keys); err != nil {
  92. logrus.Warnf("Failed to program network encryption between %s and %s: %v", lIP, rIP, err)
  93. }
  94. }
  95. } else {
  96. if len(nodes) == 0 {
  97. if err := removeEncryption(lIP, rIP, d.secMap); err != nil {
  98. logrus.Warnf("Failed to remove network encryption between %s and %s: %v", lIP, rIP, err)
  99. }
  100. }
  101. }
  102. return nil
  103. }
  104. func setupEncryption(localIP, advIP, remoteIP net.IP, vni uint32, em *encrMap, keys []*key) error {
  105. logrus.Debugf("Programming encryption for vxlan %d between %s and %s", vni, localIP, remoteIP)
  106. rIPs := remoteIP.String()
  107. indices := make([]*spi, 0, len(keys))
  108. err := programMangle(vni, true)
  109. if err != nil {
  110. logrus.Warn(err)
  111. }
  112. em.Lock()
  113. em.nodes[rIPs] = indices
  114. em.Unlock()
  115. return nil
  116. }
  117. func removeEncryption(localIP, remoteIP net.IP, em *encrMap) error {
  118. return nil
  119. }
  120. func programMangle(vni uint32, add bool) (err error) {
  121. return
  122. }
  123. func buildSPI(src, dst net.IP, st uint32) int {
  124. b := make([]byte, 4)
  125. binary.BigEndian.PutUint32(b, st)
  126. h := fnv.New32a()
  127. h.Write(src)
  128. h.Write(b)
  129. h.Write(dst)
  130. return int(binary.BigEndian.Uint32(h.Sum(nil)))
  131. }
  132. func (d *driver) secMapWalk(f func(string, []*spi) ([]*spi, bool)) error {
  133. d.secMap.Lock()
  134. for node, indices := range d.secMap.nodes {
  135. idxs, stop := f(node, indices)
  136. if idxs != nil {
  137. d.secMap.nodes[node] = idxs
  138. }
  139. if stop {
  140. break
  141. }
  142. }
  143. d.secMap.Unlock()
  144. return nil
  145. }
  146. func (d *driver) setKeys(keys []*key) error {
  147. if d.keys != nil {
  148. return types.ForbiddenErrorf("initial keys are already present")
  149. }
  150. d.keys = keys
  151. logrus.Debugf("Initial encryption keys: %v", d.keys)
  152. return nil
  153. }
  154. // updateKeys allows to add a new key and/or change the primary key and/or prune an existing key
  155. // The primary key is the key used in transmission and will go in first position in the list.
  156. func (d *driver) updateKeys(newKey, primary, pruneKey *key) error {
  157. logrus.Debugf("Updating Keys. New: %v, Primary: %v, Pruned: %v", newKey, primary, pruneKey)
  158. logrus.Debugf("Current: %v", d.keys)
  159. var (
  160. newIdx = -1
  161. priIdx = -1
  162. delIdx = -1
  163. lIP = net.ParseIP(d.bindAddress)
  164. )
  165. d.Lock()
  166. // add new
  167. if newKey != nil {
  168. d.keys = append(d.keys, newKey)
  169. newIdx += len(d.keys)
  170. }
  171. for i, k := range d.keys {
  172. if primary != nil && k.tag == primary.tag {
  173. priIdx = i
  174. }
  175. if pruneKey != nil && k.tag == pruneKey.tag {
  176. delIdx = i
  177. }
  178. }
  179. d.Unlock()
  180. if (newKey != nil && newIdx == -1) ||
  181. (primary != nil && priIdx == -1) ||
  182. (pruneKey != nil && delIdx == -1) {
  183. err := types.BadRequestErrorf("cannot find proper key indices while processing key update:"+
  184. "(newIdx,priIdx,delIdx):(%d, %d, %d)", newIdx, priIdx, delIdx)
  185. logrus.Warn(err)
  186. return err
  187. }
  188. d.secMapWalk(func(rIPs string, spis []*spi) ([]*spi, bool) {
  189. rIP := net.ParseIP(rIPs)
  190. return updateNodeKey(lIP, rIP, spis, d.keys, newIdx, priIdx, delIdx), false
  191. })
  192. d.Lock()
  193. // swap primary
  194. if priIdx != -1 {
  195. swp := d.keys[0]
  196. d.keys[0] = d.keys[priIdx]
  197. d.keys[priIdx] = swp
  198. }
  199. // prune
  200. if delIdx != -1 {
  201. if delIdx == 0 {
  202. delIdx = priIdx
  203. }
  204. d.keys = append(d.keys[:delIdx], d.keys[delIdx+1:]...)
  205. }
  206. d.Unlock()
  207. logrus.Debugf("Updated: %v", d.keys)
  208. return nil
  209. }
  210. /********************************************************
  211. * Steady state: rSA0, rSA1, rSA2, fSA1, fSP1
  212. * Rotation --> -rSA0, +rSA3, +fSA2, +fSP2/-fSP1, -fSA1
  213. * Steady state: rSA1, rSA2, rSA3, fSA2, fSP2
  214. *********************************************************/
  215. // Spis and keys are sorted in such away the one in position 0 is the primary
  216. func updateNodeKey(lIP, rIP net.IP, idxs []*spi, curKeys []*key, newIdx, priIdx, delIdx int) []*spi {
  217. logrus.Debugf("Updating keys for node: %s (%d,%d,%d)", rIP, newIdx, priIdx, delIdx)
  218. return nil
  219. }
  220. func (n *network) maxMTU() int {
  221. mtu := 1500
  222. if n.mtu != 0 {
  223. mtu = n.mtu
  224. }
  225. mtu -= vxlanEncap
  226. if n.secure {
  227. // In case of encryption account for the
  228. // esp packet espansion and padding
  229. mtu -= pktExpansion
  230. mtu -= (mtu % 4)
  231. }
  232. return mtu
  233. }