acls.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594
  1. package logic
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "sort"
  7. "time"
  8. "github.com/gravitl/netmaker/database"
  9. "github.com/gravitl/netmaker/models"
  10. )
  11. // CreateDefaultAclNetworkPolicies - create default acl network policies
  12. func CreateDefaultAclNetworkPolicies(netID models.NetworkID) {
  13. if netID.String() == "" {
  14. return
  15. }
  16. if !IsAclExists(fmt.Sprintf("%s.%s", netID, "all-nodes")) {
  17. defaultDeviceAcl := models.Acl{
  18. ID: fmt.Sprintf("%s.%s", netID, "all-nodes"),
  19. Name: "All Nodes",
  20. MetaData: "This Policy allows all nodes in the network to communicate with each other",
  21. Default: true,
  22. NetworkID: netID,
  23. RuleType: models.DevicePolicy,
  24. Src: []models.AclPolicyTag{
  25. {
  26. ID: models.DeviceAclID,
  27. Value: "*",
  28. }},
  29. Dst: []models.AclPolicyTag{
  30. {
  31. ID: models.DeviceAclID,
  32. Value: "*",
  33. }},
  34. AllowedDirection: models.TrafficDirectionBi,
  35. Enabled: true,
  36. CreatedBy: "auto",
  37. CreatedAt: time.Now().UTC(),
  38. }
  39. InsertAcl(defaultDeviceAcl)
  40. }
  41. if !IsAclExists(fmt.Sprintf("%s.%s", netID, "all-users")) {
  42. defaultUserAcl := models.Acl{
  43. ID: fmt.Sprintf("%s.%s", netID, "all-users"),
  44. Default: true,
  45. Name: "All Users",
  46. MetaData: "This policy gives access to everything in the network for an user",
  47. NetworkID: netID,
  48. RuleType: models.UserPolicy,
  49. Src: []models.AclPolicyTag{
  50. {
  51. ID: models.UserAclID,
  52. Value: "*",
  53. },
  54. {
  55. ID: models.UserGroupAclID,
  56. Value: "*",
  57. },
  58. },
  59. Dst: []models.AclPolicyTag{{
  60. ID: models.DeviceAclID,
  61. Value: "*",
  62. }},
  63. AllowedDirection: models.TrafficDirectionUni,
  64. Enabled: true,
  65. CreatedBy: "auto",
  66. CreatedAt: time.Now().UTC(),
  67. }
  68. InsertAcl(defaultUserAcl)
  69. }
  70. if !IsAclExists(fmt.Sprintf("%s.%s", netID, "all-remote-access-gws")) {
  71. defaultUserAcl := models.Acl{
  72. ID: fmt.Sprintf("%s.%s", netID, "all-remote-access-gws"),
  73. Default: true,
  74. Name: "All Remote Access Gateways",
  75. NetworkID: netID,
  76. RuleType: models.DevicePolicy,
  77. Src: []models.AclPolicyTag{
  78. {
  79. ID: models.DeviceAclID,
  80. Value: fmt.Sprintf("%s.%s", netID, models.RemoteAccessTagName),
  81. },
  82. },
  83. Dst: []models.AclPolicyTag{
  84. {
  85. ID: models.DeviceAclID,
  86. Value: "*",
  87. },
  88. },
  89. AllowedDirection: models.TrafficDirectionBi,
  90. Enabled: true,
  91. CreatedBy: "auto",
  92. CreatedAt: time.Now().UTC(),
  93. }
  94. InsertAcl(defaultUserAcl)
  95. }
  96. CreateDefaultUserPolicies(netID)
  97. }
  98. // DeleteDefaultNetworkPolicies - deletes all default network acl policies
  99. func DeleteDefaultNetworkPolicies(netId models.NetworkID) {
  100. acls, _ := ListAcls(netId)
  101. for _, acl := range acls {
  102. if acl.NetworkID == netId && acl.Default {
  103. DeleteAcl(acl)
  104. }
  105. }
  106. }
  107. // ValidateCreateAclReq - validates create req for acl
  108. func ValidateCreateAclReq(req models.Acl) error {
  109. // check if acl network exists
  110. _, err := GetNetwork(req.NetworkID.String())
  111. if err != nil {
  112. return errors.New("failed to get network details for " + req.NetworkID.String())
  113. }
  114. // err = CheckIDSyntax(req.Name)
  115. // if err != nil {
  116. // return err
  117. // }
  118. return nil
  119. }
  120. // InsertAcl - creates acl policy
  121. func InsertAcl(a models.Acl) error {
  122. d, err := json.Marshal(a)
  123. if err != nil {
  124. return err
  125. }
  126. return database.Insert(a.ID, string(d), database.ACLS_TABLE_NAME)
  127. }
  128. // GetAcl - gets acl info by id
  129. func GetAcl(aID string) (models.Acl, error) {
  130. a := models.Acl{}
  131. d, err := database.FetchRecord(database.ACLS_TABLE_NAME, aID)
  132. if err != nil {
  133. return a, err
  134. }
  135. err = json.Unmarshal([]byte(d), &a)
  136. if err != nil {
  137. return a, err
  138. }
  139. return a, nil
  140. }
  141. // IsAclExists - checks if acl exists
  142. func IsAclExists(aclID string) bool {
  143. _, err := GetAcl(aclID)
  144. return err == nil
  145. }
  146. // IsAclPolicyValid - validates if acl policy is valid
  147. func IsAclPolicyValid(acl models.Acl) bool {
  148. //check if src and dst are valid
  149. switch acl.RuleType {
  150. case models.UserPolicy:
  151. // src list should only contain users
  152. for _, srcI := range acl.Src {
  153. if srcI.ID == "" || srcI.Value == "" {
  154. return false
  155. }
  156. if srcI.Value == "*" {
  157. continue
  158. }
  159. if srcI.ID != models.UserAclID && srcI.ID != models.UserGroupAclID {
  160. return false
  161. }
  162. // check if user group is valid
  163. if srcI.ID == models.UserAclID {
  164. _, err := GetUser(srcI.Value)
  165. if err != nil {
  166. return false
  167. }
  168. } else if srcI.ID == models.UserGroupAclID {
  169. err := IsGroupValid(models.UserGroupID(srcI.Value))
  170. if err != nil {
  171. return false
  172. }
  173. }
  174. }
  175. for _, dstI := range acl.Dst {
  176. if dstI.ID == "" || dstI.Value == "" {
  177. return false
  178. }
  179. if dstI.ID != models.DeviceAclID {
  180. return false
  181. }
  182. if dstI.Value == "*" {
  183. continue
  184. }
  185. // check if tag is valid
  186. _, err := GetTag(models.TagID(dstI.Value))
  187. if err != nil {
  188. return false
  189. }
  190. }
  191. case models.DevicePolicy:
  192. for _, srcI := range acl.Src {
  193. if srcI.ID == "" || srcI.Value == "" {
  194. return false
  195. }
  196. if srcI.ID != models.DeviceAclID {
  197. return false
  198. }
  199. if srcI.Value == "*" {
  200. continue
  201. }
  202. // check if tag is valid
  203. _, err := GetTag(models.TagID(srcI.Value))
  204. if err != nil {
  205. return false
  206. }
  207. }
  208. for _, dstI := range acl.Dst {
  209. if dstI.ID == "" || dstI.Value == "" {
  210. return false
  211. }
  212. if dstI.ID != models.DeviceAclID {
  213. return false
  214. }
  215. if dstI.Value == "*" {
  216. continue
  217. }
  218. // check if tag is valid
  219. _, err := GetTag(models.TagID(dstI.Value))
  220. if err != nil {
  221. return false
  222. }
  223. }
  224. }
  225. return true
  226. }
  227. // UpdateAcl - updates allowed fields on acls and commits to DB
  228. func UpdateAcl(newAcl, acl models.Acl) error {
  229. if !acl.Default {
  230. acl.Name = newAcl.Name
  231. acl.Src = newAcl.Src
  232. acl.Dst = newAcl.Dst
  233. }
  234. acl.Enabled = newAcl.Enabled
  235. d, err := json.Marshal(acl)
  236. if err != nil {
  237. return err
  238. }
  239. return database.Insert(acl.ID, string(d), database.ACLS_TABLE_NAME)
  240. }
  241. // UpsertAcl - upserts acl
  242. func UpsertAcl(acl models.Acl) error {
  243. d, err := json.Marshal(acl)
  244. if err != nil {
  245. return err
  246. }
  247. return database.Insert(acl.ID, string(d), database.ACLS_TABLE_NAME)
  248. }
  249. // DeleteAcl - deletes acl policy
  250. func DeleteAcl(a models.Acl) error {
  251. return database.DeleteRecord(database.ACLS_TABLE_NAME, a.ID)
  252. }
  253. // GetDefaultPolicy - fetches default policy in the network by ruleType
  254. func GetDefaultPolicy(netID models.NetworkID, ruleType models.AclPolicyType) (models.Acl, error) {
  255. aclID := "all-users"
  256. if ruleType == models.DevicePolicy {
  257. aclID = "all-nodes"
  258. }
  259. acl, err := GetAcl(fmt.Sprintf("%s.%s", netID, aclID))
  260. if err != nil {
  261. return models.Acl{}, errors.New("default rule not found")
  262. }
  263. return acl, nil
  264. }
  265. // ListUserPolicies - lists all acl policies enforced on an user
  266. func ListUserPolicies(u models.User) []models.Acl {
  267. data, err := database.FetchRecords(database.ACLS_TABLE_NAME)
  268. if err != nil && !database.IsEmptyRecord(err) {
  269. return []models.Acl{}
  270. }
  271. acls := []models.Acl{}
  272. for _, dataI := range data {
  273. acl := models.Acl{}
  274. err := json.Unmarshal([]byte(dataI), &acl)
  275. if err != nil {
  276. continue
  277. }
  278. if acl.RuleType == models.UserPolicy {
  279. srcMap := convAclTagToValueMap(acl.Src)
  280. if _, ok := srcMap[u.UserName]; ok {
  281. acls = append(acls, acl)
  282. } else {
  283. // check for user groups
  284. for gID := range u.UserGroups {
  285. if _, ok := srcMap[gID.String()]; ok {
  286. acls = append(acls, acl)
  287. break
  288. }
  289. }
  290. }
  291. }
  292. }
  293. return acls
  294. }
  295. // listPoliciesOfUser - lists all user acl policies applied to user in an network
  296. func listPoliciesOfUser(user models.User, netID models.NetworkID) []models.Acl {
  297. data, err := database.FetchRecords(database.ACLS_TABLE_NAME)
  298. if err != nil && !database.IsEmptyRecord(err) {
  299. return []models.Acl{}
  300. }
  301. acls := []models.Acl{}
  302. for _, dataI := range data {
  303. acl := models.Acl{}
  304. err := json.Unmarshal([]byte(dataI), &acl)
  305. if err != nil {
  306. continue
  307. }
  308. if acl.NetworkID == netID && acl.RuleType == models.UserPolicy {
  309. srcMap := convAclTagToValueMap(acl.Src)
  310. if _, ok := srcMap[user.UserName]; ok {
  311. acls = append(acls, acl)
  312. continue
  313. }
  314. for netRole := range user.NetworkRoles {
  315. if _, ok := srcMap[netRole.String()]; ok {
  316. acls = append(acls, acl)
  317. continue
  318. }
  319. }
  320. for userG := range user.UserGroups {
  321. if _, ok := srcMap[userG.String()]; ok {
  322. acls = append(acls, acl)
  323. continue
  324. }
  325. }
  326. }
  327. }
  328. return acls
  329. }
  330. // listUserPoliciesByNetwork - lists all acl user policies in a network
  331. func listUserPoliciesByNetwork(netID models.NetworkID) []models.Acl {
  332. data, err := database.FetchRecords(database.ACLS_TABLE_NAME)
  333. if err != nil && !database.IsEmptyRecord(err) {
  334. return []models.Acl{}
  335. }
  336. acls := []models.Acl{}
  337. for _, dataI := range data {
  338. acl := models.Acl{}
  339. err := json.Unmarshal([]byte(dataI), &acl)
  340. if err != nil {
  341. continue
  342. }
  343. if acl.NetworkID == netID && acl.RuleType == models.UserPolicy {
  344. acls = append(acls, acl)
  345. }
  346. }
  347. return acls
  348. }
  349. // listDevicePolicies - lists all device policies in a network
  350. func listDevicePolicies(netID models.NetworkID) []models.Acl {
  351. data, err := database.FetchRecords(database.ACLS_TABLE_NAME)
  352. if err != nil && !database.IsEmptyRecord(err) {
  353. return []models.Acl{}
  354. }
  355. acls := []models.Acl{}
  356. for _, dataI := range data {
  357. acl := models.Acl{}
  358. err := json.Unmarshal([]byte(dataI), &acl)
  359. if err != nil {
  360. continue
  361. }
  362. if acl.NetworkID == netID && acl.RuleType == models.DevicePolicy {
  363. acls = append(acls, acl)
  364. }
  365. }
  366. return acls
  367. }
  368. // ListAcls - lists all acl policies
  369. func ListAcls(netID models.NetworkID) ([]models.Acl, error) {
  370. data, err := database.FetchRecords(database.ACLS_TABLE_NAME)
  371. if err != nil && !database.IsEmptyRecord(err) {
  372. return []models.Acl{}, err
  373. }
  374. acls := []models.Acl{}
  375. for _, dataI := range data {
  376. acl := models.Acl{}
  377. err := json.Unmarshal([]byte(dataI), &acl)
  378. if err != nil {
  379. continue
  380. }
  381. if acl.NetworkID == netID {
  382. acls = append(acls, acl)
  383. }
  384. }
  385. return acls, nil
  386. }
  387. func convAclTagToValueMap(acltags []models.AclPolicyTag) map[string]struct{} {
  388. aclValueMap := make(map[string]struct{})
  389. for _, aclTagI := range acltags {
  390. aclValueMap[aclTagI.Value] = struct{}{}
  391. }
  392. return aclValueMap
  393. }
  394. // IsUserAllowedToCommunicate - check if user is allowed to communicate with peer
  395. func IsUserAllowedToCommunicate(userName string, peer models.Node) bool {
  396. if peer.IsStatic {
  397. peer = peer.StaticNode.ConvertToStaticNode()
  398. }
  399. acl, _ := GetDefaultPolicy(models.NetworkID(peer.Network), models.UserPolicy)
  400. if acl.Enabled {
  401. return true
  402. }
  403. user, err := GetUser(userName)
  404. if err != nil {
  405. return false
  406. }
  407. policies := listPoliciesOfUser(*user, models.NetworkID(peer.Network))
  408. for _, policy := range policies {
  409. if !policy.Enabled {
  410. continue
  411. }
  412. dstMap := convAclTagToValueMap(policy.Dst)
  413. if _, ok := dstMap["*"]; ok {
  414. return true
  415. }
  416. for tagID := range peer.Tags {
  417. if _, ok := dstMap[tagID.String()]; ok {
  418. return true
  419. }
  420. }
  421. }
  422. return false
  423. }
  424. // IsNodeAllowedToCommunicate - check node is allowed to communicate with the peer
  425. func IsNodeAllowedToCommunicate(node, peer models.Node) bool {
  426. if node.IsStatic {
  427. node = node.StaticNode.ConvertToStaticNode()
  428. }
  429. if peer.IsStatic {
  430. peer = peer.StaticNode.ConvertToStaticNode()
  431. }
  432. // check default policy if all allowed return true
  433. defaultPolicy, err := GetDefaultPolicy(models.NetworkID(node.Network), models.DevicePolicy)
  434. if err == nil {
  435. if defaultPolicy.Enabled {
  436. return true
  437. }
  438. }
  439. // list device policies
  440. policies := listDevicePolicies(models.NetworkID(peer.Network))
  441. for _, policy := range policies {
  442. if !policy.Enabled {
  443. continue
  444. }
  445. srcMap := convAclTagToValueMap(policy.Src)
  446. dstMap := convAclTagToValueMap(policy.Dst)
  447. // fmt.Printf("\n======> SRCMAP: %+v\n", srcMap)
  448. // fmt.Printf("\n======> DSTMAP: %+v\n", dstMap)
  449. // fmt.Printf("\n======> node Tags: %+v\n", node.Tags)
  450. // fmt.Printf("\n======> peer Tags: %+v\n", peer.Tags)
  451. for tagID := range node.Tags {
  452. if _, ok := dstMap[tagID.String()]; ok {
  453. if _, ok := srcMap["*"]; ok {
  454. return true
  455. }
  456. for tagID := range peer.Tags {
  457. if _, ok := srcMap[tagID.String()]; ok {
  458. return true
  459. }
  460. }
  461. }
  462. if _, ok := srcMap[tagID.String()]; ok {
  463. if _, ok := dstMap["*"]; ok {
  464. return true
  465. }
  466. for tagID := range peer.Tags {
  467. if _, ok := dstMap[tagID.String()]; ok {
  468. return true
  469. }
  470. }
  471. }
  472. }
  473. for tagID := range peer.Tags {
  474. if _, ok := dstMap[tagID.String()]; ok {
  475. if _, ok := srcMap["*"]; ok {
  476. return true
  477. }
  478. for tagID := range node.Tags {
  479. if _, ok := srcMap[tagID.String()]; ok {
  480. return true
  481. }
  482. }
  483. }
  484. if _, ok := srcMap[tagID.String()]; ok {
  485. if _, ok := dstMap["*"]; ok {
  486. return true
  487. }
  488. for tagID := range node.Tags {
  489. if _, ok := dstMap[tagID.String()]; ok {
  490. return true
  491. }
  492. }
  493. }
  494. }
  495. }
  496. return false
  497. }
  498. // SortTagEntrys - Sorts slice of Tag entries by their id
  499. func SortAclEntrys(acls []models.Acl) {
  500. sort.Slice(acls, func(i, j int) bool {
  501. return acls[i].Name < acls[j].Name
  502. })
  503. }
  504. // UpdateDeviceTag - updates device tag on acl policies
  505. func UpdateDeviceTag(OldID, newID models.TagID, netID models.NetworkID) {
  506. acls := listDevicePolicies(netID)
  507. update := false
  508. for _, acl := range acls {
  509. for i, srcTagI := range acl.Src {
  510. if srcTagI.ID == models.DeviceAclID {
  511. if OldID.String() == srcTagI.Value {
  512. acl.Src[i].Value = newID.String()
  513. update = true
  514. }
  515. }
  516. }
  517. for i, dstTagI := range acl.Dst {
  518. if dstTagI.ID == models.DeviceAclID {
  519. if OldID.String() == dstTagI.Value {
  520. acl.Dst[i].Value = newID.String()
  521. update = true
  522. }
  523. }
  524. }
  525. if update {
  526. UpsertAcl(acl)
  527. }
  528. }
  529. }
  530. // RemoveDeviceTagFromAclPolicies - remove device tag from acl policies
  531. func RemoveDeviceTagFromAclPolicies(tagID models.TagID, netID models.NetworkID) error {
  532. acls := listDevicePolicies(netID)
  533. update := false
  534. for _, acl := range acls {
  535. for i, srcTagI := range acl.Src {
  536. if srcTagI.ID == models.DeviceAclID {
  537. if tagID.String() == srcTagI.Value {
  538. acl.Src = append(acl.Src[:i], acl.Src[i+1:]...)
  539. update = true
  540. }
  541. }
  542. }
  543. for i, dstTagI := range acl.Dst {
  544. if dstTagI.ID == models.DeviceAclID {
  545. if tagID.String() == dstTagI.Value {
  546. acl.Dst = append(acl.Dst[:i], acl.Dst[i+1:]...)
  547. update = true
  548. }
  549. }
  550. }
  551. if update {
  552. UpsertAcl(acl)
  553. }
  554. }
  555. return nil
  556. }