acls.go 14 KB

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