ctl_v3_auth_test.go 28 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015
  1. // Copyright 2016 The etcd Authors
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package e2e
  15. import (
  16. "fmt"
  17. "os"
  18. "testing"
  19. "github.com/coreos/etcd/clientv3"
  20. )
  21. func TestCtlV3AuthEnable(t *testing.T) { testCtl(t, authEnableTest) }
  22. func TestCtlV3AuthDisable(t *testing.T) { testCtl(t, authDisableTest) }
  23. func TestCtlV3AuthWriteKey(t *testing.T) { testCtl(t, authCredWriteKeyTest) }
  24. func TestCtlV3AuthRoleUpdate(t *testing.T) { testCtl(t, authRoleUpdateTest) }
  25. func TestCtlV3AuthUserDeleteDuringOps(t *testing.T) { testCtl(t, authUserDeleteDuringOpsTest) }
  26. func TestCtlV3AuthRoleRevokeDuringOps(t *testing.T) { testCtl(t, authRoleRevokeDuringOpsTest) }
  27. func TestCtlV3AuthTxn(t *testing.T) { testCtl(t, authTestTxn) }
  28. func TestCtlV3AuthPrefixPerm(t *testing.T) { testCtl(t, authTestPrefixPerm) }
  29. func TestCtlV3AuthMemberAdd(t *testing.T) { testCtl(t, authTestMemberAdd) }
  30. func TestCtlV3AuthMemberRemove(t *testing.T) {
  31. testCtl(t, authTestMemberRemove, withQuorum(), withNoStrictReconfig())
  32. }
  33. func TestCtlV3AuthMemberUpdate(t *testing.T) { testCtl(t, authTestMemberUpdate) }
  34. func TestCtlV3AuthCertCN(t *testing.T) { testCtl(t, authTestCertCN, withCfg(configClientTLSCertAuth)) }
  35. func TestCtlV3AuthRevokeWithDelete(t *testing.T) { testCtl(t, authTestRevokeWithDelete) }
  36. func TestCtlV3AuthInvalidMgmt(t *testing.T) { testCtl(t, authTestInvalidMgmt) }
  37. func TestCtlV3AuthFromKeyPerm(t *testing.T) { testCtl(t, authTestFromKeyPerm) }
  38. func TestCtlV3AuthAndWatch(t *testing.T) { testCtl(t, authTestWatch) }
  39. func TestCtlV3AuthRoleGet(t *testing.T) { testCtl(t, authTestRoleGet) }
  40. func TestCtlV3AuthUserGet(t *testing.T) { testCtl(t, authTestUserGet) }
  41. func TestCtlV3AuthRoleList(t *testing.T) { testCtl(t, authTestRoleList) }
  42. func TestCtlV3AuthDefrag(t *testing.T) { testCtl(t, authTestDefrag) }
  43. func TestCtlV3AuthEndpointHealth(t *testing.T) {
  44. testCtl(t, authTestEndpointHealth, withQuorum())
  45. }
  46. func TestCtlV3AuthSnapshot(t *testing.T) { testCtl(t, authTestSnapshot) }
  47. func TestCtlV3AuthCertCNAndUsername(t *testing.T) {
  48. testCtl(t, authTestCertCNAndUsername, withCfg(configClientTLSCertAuth))
  49. }
  50. func authEnableTest(cx ctlCtx) {
  51. if err := authEnable(cx); err != nil {
  52. cx.t.Fatal(err)
  53. }
  54. }
  55. func authEnable(cx ctlCtx) error {
  56. // create root user with root role
  57. if err := ctlV3User(cx, []string{"add", "root", "--interactive=false"}, "User root created", []string{"root"}); err != nil {
  58. return fmt.Errorf("failed to create root user %v", err)
  59. }
  60. if err := ctlV3User(cx, []string{"grant-role", "root", "root"}, "Role root is granted to user root", nil); err != nil {
  61. return fmt.Errorf("failed to grant root user root role %v", err)
  62. }
  63. if err := ctlV3AuthEnable(cx); err != nil {
  64. return fmt.Errorf("authEnableTest ctlV3AuthEnable error (%v)", err)
  65. }
  66. return nil
  67. }
  68. func ctlV3AuthEnable(cx ctlCtx) error {
  69. cmdArgs := append(cx.PrefixArgs(), "auth", "enable")
  70. return spawnWithExpect(cmdArgs, "Authentication Enabled")
  71. }
  72. func authDisableTest(cx ctlCtx) {
  73. // a key that isn't granted to test-user
  74. if err := ctlV3Put(cx, "hoo", "a", ""); err != nil {
  75. cx.t.Fatal(err)
  76. }
  77. if err := authEnable(cx); err != nil {
  78. cx.t.Fatal(err)
  79. }
  80. cx.user, cx.pass = "root", "root"
  81. authSetupTestUser(cx)
  82. // test-user doesn't have the permission, it must fail
  83. cx.user, cx.pass = "test-user", "pass"
  84. if err := ctlV3PutFailPerm(cx, "hoo", "bar"); err != nil {
  85. cx.t.Fatal(err)
  86. }
  87. cx.user, cx.pass = "root", "root"
  88. if err := ctlV3AuthDisable(cx); err != nil {
  89. cx.t.Fatalf("authDisableTest ctlV3AuthDisable error (%v)", err)
  90. }
  91. // now ErrAuthNotEnabled of Authenticate() is simply ignored
  92. cx.user, cx.pass = "test-user", "pass"
  93. if err := ctlV3Put(cx, "hoo", "bar", ""); err != nil {
  94. cx.t.Fatal(err)
  95. }
  96. // now the key can be accessed
  97. cx.user, cx.pass = "", ""
  98. if err := ctlV3Put(cx, "hoo", "bar", ""); err != nil {
  99. cx.t.Fatal(err)
  100. }
  101. // confirm put succeeded
  102. if err := ctlV3Get(cx, []string{"hoo"}, []kv{{"hoo", "bar"}}...); err != nil {
  103. cx.t.Fatal(err)
  104. }
  105. }
  106. func ctlV3AuthDisable(cx ctlCtx) error {
  107. cmdArgs := append(cx.PrefixArgs(), "auth", "disable")
  108. return spawnWithExpect(cmdArgs, "Authentication Disabled")
  109. }
  110. func authCredWriteKeyTest(cx ctlCtx) {
  111. // baseline key to check for failed puts
  112. if err := ctlV3Put(cx, "foo", "a", ""); err != nil {
  113. cx.t.Fatal(err)
  114. }
  115. if err := authEnable(cx); err != nil {
  116. cx.t.Fatal(err)
  117. }
  118. cx.user, cx.pass = "root", "root"
  119. authSetupTestUser(cx)
  120. // confirm root role can access to all keys
  121. if err := ctlV3Put(cx, "foo", "bar", ""); err != nil {
  122. cx.t.Fatal(err)
  123. }
  124. if err := ctlV3Get(cx, []string{"foo"}, []kv{{"foo", "bar"}}...); err != nil {
  125. cx.t.Fatal(err)
  126. }
  127. // try invalid user
  128. cx.user, cx.pass = "a", "b"
  129. if err := ctlV3PutFailAuth(cx, "foo", "bar"); err != nil {
  130. cx.t.Fatal(err)
  131. }
  132. // confirm put failed
  133. cx.user, cx.pass = "test-user", "pass"
  134. if err := ctlV3Get(cx, []string{"foo"}, []kv{{"foo", "bar"}}...); err != nil {
  135. cx.t.Fatal(err)
  136. }
  137. // try good user
  138. cx.user, cx.pass = "test-user", "pass"
  139. if err := ctlV3Put(cx, "foo", "bar2", ""); err != nil {
  140. cx.t.Fatal(err)
  141. }
  142. // confirm put succeeded
  143. if err := ctlV3Get(cx, []string{"foo"}, []kv{{"foo", "bar2"}}...); err != nil {
  144. cx.t.Fatal(err)
  145. }
  146. // try bad password
  147. cx.user, cx.pass = "test-user", "badpass"
  148. if err := ctlV3PutFailAuth(cx, "foo", "baz"); err != nil {
  149. cx.t.Fatal(err)
  150. }
  151. // confirm put failed
  152. cx.user, cx.pass = "test-user", "pass"
  153. if err := ctlV3Get(cx, []string{"foo"}, []kv{{"foo", "bar2"}}...); err != nil {
  154. cx.t.Fatal(err)
  155. }
  156. }
  157. func authRoleUpdateTest(cx ctlCtx) {
  158. if err := ctlV3Put(cx, "foo", "bar", ""); err != nil {
  159. cx.t.Fatal(err)
  160. }
  161. if err := authEnable(cx); err != nil {
  162. cx.t.Fatal(err)
  163. }
  164. cx.user, cx.pass = "root", "root"
  165. authSetupTestUser(cx)
  166. // try put to not granted key
  167. cx.user, cx.pass = "test-user", "pass"
  168. if err := ctlV3PutFailPerm(cx, "hoo", "bar"); err != nil {
  169. cx.t.Fatal(err)
  170. }
  171. // grant a new key
  172. cx.user, cx.pass = "root", "root"
  173. if err := ctlV3RoleGrantPermission(cx, "test-role", grantingPerm{true, true, "hoo", "", false}); err != nil {
  174. cx.t.Fatal(err)
  175. }
  176. // try a newly granted key
  177. cx.user, cx.pass = "test-user", "pass"
  178. if err := ctlV3Put(cx, "hoo", "bar", ""); err != nil {
  179. cx.t.Fatal(err)
  180. }
  181. // confirm put succeeded
  182. if err := ctlV3Get(cx, []string{"hoo"}, []kv{{"hoo", "bar"}}...); err != nil {
  183. cx.t.Fatal(err)
  184. }
  185. // revoke the newly granted key
  186. cx.user, cx.pass = "root", "root"
  187. if err := ctlV3RoleRevokePermission(cx, "test-role", "hoo", "", false); err != nil {
  188. cx.t.Fatal(err)
  189. }
  190. // try put to the revoked key
  191. cx.user, cx.pass = "test-user", "pass"
  192. if err := ctlV3PutFailPerm(cx, "hoo", "bar"); err != nil {
  193. cx.t.Fatal(err)
  194. }
  195. // confirm a key still granted can be accessed
  196. if err := ctlV3Get(cx, []string{"foo"}, []kv{{"foo", "bar"}}...); err != nil {
  197. cx.t.Fatal(err)
  198. }
  199. }
  200. func authUserDeleteDuringOpsTest(cx ctlCtx) {
  201. if err := ctlV3Put(cx, "foo", "bar", ""); err != nil {
  202. cx.t.Fatal(err)
  203. }
  204. if err := authEnable(cx); err != nil {
  205. cx.t.Fatal(err)
  206. }
  207. cx.user, cx.pass = "root", "root"
  208. authSetupTestUser(cx)
  209. // create a key
  210. cx.user, cx.pass = "test-user", "pass"
  211. if err := ctlV3Put(cx, "foo", "bar", ""); err != nil {
  212. cx.t.Fatal(err)
  213. }
  214. // confirm put succeeded
  215. if err := ctlV3Get(cx, []string{"foo"}, []kv{{"foo", "bar"}}...); err != nil {
  216. cx.t.Fatal(err)
  217. }
  218. // delete the user
  219. cx.user, cx.pass = "root", "root"
  220. err := ctlV3User(cx, []string{"delete", "test-user"}, "User test-user deleted", []string{})
  221. if err != nil {
  222. cx.t.Fatal(err)
  223. }
  224. // check the user is deleted
  225. cx.user, cx.pass = "test-user", "pass"
  226. if err := ctlV3PutFailAuth(cx, "foo", "baz"); err != nil {
  227. cx.t.Fatal(err)
  228. }
  229. }
  230. func authRoleRevokeDuringOpsTest(cx ctlCtx) {
  231. if err := ctlV3Put(cx, "foo", "bar", ""); err != nil {
  232. cx.t.Fatal(err)
  233. }
  234. if err := authEnable(cx); err != nil {
  235. cx.t.Fatal(err)
  236. }
  237. cx.user, cx.pass = "root", "root"
  238. authSetupTestUser(cx)
  239. // create a key
  240. cx.user, cx.pass = "test-user", "pass"
  241. if err := ctlV3Put(cx, "foo", "bar", ""); err != nil {
  242. cx.t.Fatal(err)
  243. }
  244. // confirm put succeeded
  245. if err := ctlV3Get(cx, []string{"foo"}, []kv{{"foo", "bar"}}...); err != nil {
  246. cx.t.Fatal(err)
  247. }
  248. // create a new role
  249. cx.user, cx.pass = "root", "root"
  250. if err := ctlV3Role(cx, []string{"add", "test-role2"}, "Role test-role2 created"); err != nil {
  251. cx.t.Fatal(err)
  252. }
  253. // grant a new key to the new role
  254. if err := ctlV3RoleGrantPermission(cx, "test-role2", grantingPerm{true, true, "hoo", "", false}); err != nil {
  255. cx.t.Fatal(err)
  256. }
  257. // grant the new role to the user
  258. if err := ctlV3User(cx, []string{"grant-role", "test-user", "test-role2"}, "Role test-role2 is granted to user test-user", nil); err != nil {
  259. cx.t.Fatal(err)
  260. }
  261. // try a newly granted key
  262. cx.user, cx.pass = "test-user", "pass"
  263. if err := ctlV3Put(cx, "hoo", "bar", ""); err != nil {
  264. cx.t.Fatal(err)
  265. }
  266. // confirm put succeeded
  267. if err := ctlV3Get(cx, []string{"hoo"}, []kv{{"hoo", "bar"}}...); err != nil {
  268. cx.t.Fatal(err)
  269. }
  270. // revoke a role from the user
  271. cx.user, cx.pass = "root", "root"
  272. err := ctlV3User(cx, []string{"revoke-role", "test-user", "test-role"}, "Role test-role is revoked from user test-user", []string{})
  273. if err != nil {
  274. cx.t.Fatal(err)
  275. }
  276. // check the role is revoked and permission is lost from the user
  277. cx.user, cx.pass = "test-user", "pass"
  278. if err := ctlV3PutFailPerm(cx, "foo", "baz"); err != nil {
  279. cx.t.Fatal(err)
  280. }
  281. // try a key that can be accessed from the remaining role
  282. cx.user, cx.pass = "test-user", "pass"
  283. if err := ctlV3Put(cx, "hoo", "bar2", ""); err != nil {
  284. cx.t.Fatal(err)
  285. }
  286. // confirm put succeeded
  287. if err := ctlV3Get(cx, []string{"hoo"}, []kv{{"hoo", "bar2"}}...); err != nil {
  288. cx.t.Fatal(err)
  289. }
  290. }
  291. func ctlV3PutFailAuth(cx ctlCtx, key, val string) error {
  292. return spawnWithExpect(append(cx.PrefixArgs(), "put", key, val), "authentication failed")
  293. }
  294. func ctlV3PutFailPerm(cx ctlCtx, key, val string) error {
  295. return spawnWithExpect(append(cx.PrefixArgs(), "put", key, val), "permission denied")
  296. }
  297. func authSetupTestUser(cx ctlCtx) {
  298. if err := ctlV3User(cx, []string{"add", "test-user", "--interactive=false"}, "User test-user created", []string{"pass"}); err != nil {
  299. cx.t.Fatal(err)
  300. }
  301. if err := spawnWithExpect(append(cx.PrefixArgs(), "role", "add", "test-role"), "Role test-role created"); err != nil {
  302. cx.t.Fatal(err)
  303. }
  304. if err := ctlV3User(cx, []string{"grant-role", "test-user", "test-role"}, "Role test-role is granted to user test-user", nil); err != nil {
  305. cx.t.Fatal(err)
  306. }
  307. cmd := append(cx.PrefixArgs(), "role", "grant-permission", "test-role", "readwrite", "foo")
  308. if err := spawnWithExpect(cmd, "Role test-role updated"); err != nil {
  309. cx.t.Fatal(err)
  310. }
  311. }
  312. func authTestTxn(cx ctlCtx) {
  313. // keys with 1 suffix aren't granted to test-user
  314. // keys with 2 suffix are granted to test-user
  315. keys := []string{"c1", "s1", "f1"}
  316. grantedKeys := []string{"c2", "s2", "f2"}
  317. for _, key := range keys {
  318. if err := ctlV3Put(cx, key, "v", ""); err != nil {
  319. cx.t.Fatal(err)
  320. }
  321. }
  322. for _, key := range grantedKeys {
  323. if err := ctlV3Put(cx, key, "v", ""); err != nil {
  324. cx.t.Fatal(err)
  325. }
  326. }
  327. if err := authEnable(cx); err != nil {
  328. cx.t.Fatal(err)
  329. }
  330. cx.user, cx.pass = "root", "root"
  331. authSetupTestUser(cx)
  332. // grant keys to test-user
  333. cx.user, cx.pass = "root", "root"
  334. for _, key := range grantedKeys {
  335. if err := ctlV3RoleGrantPermission(cx, "test-role", grantingPerm{true, true, key, "", false}); err != nil {
  336. cx.t.Fatal(err)
  337. }
  338. }
  339. // now test txn
  340. cx.interactive = true
  341. cx.user, cx.pass = "test-user", "pass"
  342. rqs := txnRequests{
  343. compare: []string{`version("c2") = "1"`},
  344. ifSucess: []string{"get s2"},
  345. ifFail: []string{"get f2"},
  346. results: []string{"SUCCESS", "s2", "v"},
  347. }
  348. if err := ctlV3Txn(cx, rqs); err != nil {
  349. cx.t.Fatal(err)
  350. }
  351. // a key of compare case isn't granted
  352. rqs = txnRequests{
  353. compare: []string{`version("c1") = "1"`},
  354. ifSucess: []string{"get s2"},
  355. ifFail: []string{"get f2"},
  356. results: []string{"Error: etcdserver: permission denied"},
  357. }
  358. if err := ctlV3Txn(cx, rqs); err != nil {
  359. cx.t.Fatal(err)
  360. }
  361. // a key of success case isn't granted
  362. rqs = txnRequests{
  363. compare: []string{`version("c2") = "1"`},
  364. ifSucess: []string{"get s1"},
  365. ifFail: []string{"get f2"},
  366. results: []string{"Error: etcdserver: permission denied"},
  367. }
  368. if err := ctlV3Txn(cx, rqs); err != nil {
  369. cx.t.Fatal(err)
  370. }
  371. // a key of failure case isn't granted
  372. rqs = txnRequests{
  373. compare: []string{`version("c2") = "1"`},
  374. ifSucess: []string{"get s2"},
  375. ifFail: []string{"get f1"},
  376. results: []string{"Error: etcdserver: permission denied"},
  377. }
  378. if err := ctlV3Txn(cx, rqs); err != nil {
  379. cx.t.Fatal(err)
  380. }
  381. }
  382. func authTestPrefixPerm(cx ctlCtx) {
  383. if err := authEnable(cx); err != nil {
  384. cx.t.Fatal(err)
  385. }
  386. cx.user, cx.pass = "root", "root"
  387. authSetupTestUser(cx)
  388. prefix := "/prefix/" // directory like prefix
  389. // grant keys to test-user
  390. cx.user, cx.pass = "root", "root"
  391. if err := ctlV3RoleGrantPermission(cx, "test-role", grantingPerm{true, true, prefix, "", true}); err != nil {
  392. cx.t.Fatal(err)
  393. }
  394. // try a prefix granted permission
  395. cx.user, cx.pass = "test-user", "pass"
  396. for i := 0; i < 10; i++ {
  397. key := fmt.Sprintf("%s%d", prefix, i)
  398. if err := ctlV3Put(cx, key, "val", ""); err != nil {
  399. cx.t.Fatal(err)
  400. }
  401. }
  402. if err := ctlV3PutFailPerm(cx, clientv3.GetPrefixRangeEnd(prefix), "baz"); err != nil {
  403. cx.t.Fatal(err)
  404. }
  405. // grant the entire keys to test-user
  406. cx.user, cx.pass = "root", "root"
  407. if err := ctlV3RoleGrantPermission(cx, "test-role", grantingPerm{true, true, "", "", true}); err != nil {
  408. cx.t.Fatal(err)
  409. }
  410. prefix2 := "/prefix2/"
  411. cx.user, cx.pass = "test-user", "pass"
  412. for i := 0; i < 10; i++ {
  413. key := fmt.Sprintf("%s%d", prefix2, i)
  414. if err := ctlV3Put(cx, key, "val", ""); err != nil {
  415. cx.t.Fatal(err)
  416. }
  417. }
  418. }
  419. func authTestMemberAdd(cx ctlCtx) {
  420. if err := authEnable(cx); err != nil {
  421. cx.t.Fatal(err)
  422. }
  423. cx.user, cx.pass = "root", "root"
  424. authSetupTestUser(cx)
  425. peerURL := fmt.Sprintf("http://localhost:%d", etcdProcessBasePort+11)
  426. // ordinary user cannot add a new member
  427. cx.user, cx.pass = "test-user", "pass"
  428. if err := ctlV3MemberAdd(cx, peerURL); err == nil {
  429. cx.t.Fatalf("ordinary user must not be allowed to add a member")
  430. }
  431. // root can add a new member
  432. cx.user, cx.pass = "root", "root"
  433. if err := ctlV3MemberAdd(cx, peerURL); err != nil {
  434. cx.t.Fatal(err)
  435. }
  436. }
  437. func authTestMemberRemove(cx ctlCtx) {
  438. if err := authEnable(cx); err != nil {
  439. cx.t.Fatal(err)
  440. }
  441. cx.user, cx.pass = "root", "root"
  442. authSetupTestUser(cx)
  443. ep, memIDToRemove, clusterID := cx.memberToRemove()
  444. // ordinary user cannot remove a member
  445. cx.user, cx.pass = "test-user", "pass"
  446. if err := ctlV3MemberRemove(cx, ep, memIDToRemove, clusterID); err == nil {
  447. cx.t.Fatalf("ordinary user must not be allowed to remove a member")
  448. }
  449. // root can remove a member
  450. cx.user, cx.pass = "root", "root"
  451. if err := ctlV3MemberRemove(cx, ep, memIDToRemove, clusterID); err != nil {
  452. cx.t.Fatal(err)
  453. }
  454. }
  455. func authTestMemberUpdate(cx ctlCtx) {
  456. if err := authEnable(cx); err != nil {
  457. cx.t.Fatal(err)
  458. }
  459. cx.user, cx.pass = "root", "root"
  460. authSetupTestUser(cx)
  461. mr, err := getMemberList(cx)
  462. if err != nil {
  463. cx.t.Fatal(err)
  464. }
  465. // ordinary user cannot update a member
  466. cx.user, cx.pass = "test-user", "pass"
  467. peerURL := fmt.Sprintf("http://localhost:%d", etcdProcessBasePort+11)
  468. memberID := fmt.Sprintf("%x", mr.Members[0].ID)
  469. if err = ctlV3MemberUpdate(cx, memberID, peerURL); err == nil {
  470. cx.t.Fatalf("ordinary user must not be allowed to update a member")
  471. }
  472. // root can update a member
  473. cx.user, cx.pass = "root", "root"
  474. if err = ctlV3MemberUpdate(cx, memberID, peerURL); err != nil {
  475. cx.t.Fatal(err)
  476. }
  477. }
  478. func authTestCertCN(cx ctlCtx) {
  479. if err := authEnable(cx); err != nil {
  480. cx.t.Fatal(err)
  481. }
  482. cx.user, cx.pass = "root", "root"
  483. if err := ctlV3User(cx, []string{"add", "example.com", "--interactive=false"}, "User example.com created", []string{""}); err != nil {
  484. cx.t.Fatal(err)
  485. }
  486. if err := spawnWithExpect(append(cx.PrefixArgs(), "role", "add", "test-role"), "Role test-role created"); err != nil {
  487. cx.t.Fatal(err)
  488. }
  489. if err := ctlV3User(cx, []string{"grant-role", "example.com", "test-role"}, "Role test-role is granted to user example.com", nil); err != nil {
  490. cx.t.Fatal(err)
  491. }
  492. // grant a new key
  493. if err := ctlV3RoleGrantPermission(cx, "test-role", grantingPerm{true, true, "hoo", "", false}); err != nil {
  494. cx.t.Fatal(err)
  495. }
  496. // try a granted key
  497. cx.user, cx.pass = "", ""
  498. if err := ctlV3Put(cx, "hoo", "bar", ""); err != nil {
  499. cx.t.Error(err)
  500. }
  501. // try a non granted key
  502. cx.user, cx.pass = "", ""
  503. if err := ctlV3PutFailPerm(cx, "baz", "bar"); err != nil {
  504. cx.t.Error(err)
  505. }
  506. }
  507. func authTestRevokeWithDelete(cx ctlCtx) {
  508. if err := authEnable(cx); err != nil {
  509. cx.t.Fatal(err)
  510. }
  511. cx.user, cx.pass = "root", "root"
  512. authSetupTestUser(cx)
  513. // create a new role
  514. cx.user, cx.pass = "root", "root"
  515. if err := ctlV3Role(cx, []string{"add", "test-role2"}, "Role test-role2 created"); err != nil {
  516. cx.t.Fatal(err)
  517. }
  518. // grant the new role to the user
  519. if err := ctlV3User(cx, []string{"grant-role", "test-user", "test-role2"}, "Role test-role2 is granted to user test-user", nil); err != nil {
  520. cx.t.Fatal(err)
  521. }
  522. // check the result
  523. if err := ctlV3User(cx, []string{"get", "test-user"}, "Roles: test-role test-role2", nil); err != nil {
  524. cx.t.Fatal(err)
  525. }
  526. // delete the role, test-role2 must be revoked from test-user
  527. if err := ctlV3Role(cx, []string{"delete", "test-role2"}, "Role test-role2 deleted"); err != nil {
  528. cx.t.Fatal(err)
  529. }
  530. // check the result
  531. if err := ctlV3User(cx, []string{"get", "test-user"}, "Roles: test-role", nil); err != nil {
  532. cx.t.Fatal(err)
  533. }
  534. }
  535. func authTestInvalidMgmt(cx ctlCtx) {
  536. if err := authEnable(cx); err != nil {
  537. cx.t.Fatal(err)
  538. }
  539. if err := ctlV3Role(cx, []string{"delete", "root"}, "Error: etcdserver: invalid auth management"); err == nil {
  540. cx.t.Fatal("deleting the role root must not be allowed")
  541. }
  542. if err := ctlV3User(cx, []string{"revoke-role", "root", "root"}, "Error: etcdserver: invalid auth management", []string{}); err == nil {
  543. cx.t.Fatal("revoking the role root from the user root must not be allowed")
  544. }
  545. }
  546. func authTestFromKeyPerm(cx ctlCtx) {
  547. if err := authEnable(cx); err != nil {
  548. cx.t.Fatal(err)
  549. }
  550. cx.user, cx.pass = "root", "root"
  551. authSetupTestUser(cx)
  552. // grant keys after z to test-user
  553. cx.user, cx.pass = "root", "root"
  554. if err := ctlV3RoleGrantPermission(cx, "test-role", grantingPerm{true, true, "z", "\x00", false}); err != nil {
  555. cx.t.Fatal(err)
  556. }
  557. // try the granted open ended permission
  558. cx.user, cx.pass = "test-user", "pass"
  559. for i := 0; i < 10; i++ {
  560. key := fmt.Sprintf("z%d", i)
  561. if err := ctlV3Put(cx, key, "val", ""); err != nil {
  562. cx.t.Fatal(err)
  563. }
  564. }
  565. largeKey := ""
  566. for i := 0; i < 10; i++ {
  567. largeKey += "\xff"
  568. if err := ctlV3Put(cx, largeKey, "val", ""); err != nil {
  569. cx.t.Fatal(err)
  570. }
  571. }
  572. // try a non granted key
  573. if err := ctlV3PutFailPerm(cx, "x", "baz"); err != nil {
  574. cx.t.Fatal(err)
  575. }
  576. // revoke the open ended permission
  577. cx.user, cx.pass = "root", "root"
  578. if err := ctlV3RoleRevokePermission(cx, "test-role", "z", "", true); err != nil {
  579. cx.t.Fatal(err)
  580. }
  581. // try the revoked open ended permission
  582. cx.user, cx.pass = "test-user", "pass"
  583. for i := 0; i < 10; i++ {
  584. key := fmt.Sprintf("z%d", i)
  585. if err := ctlV3PutFailPerm(cx, key, "val"); err != nil {
  586. cx.t.Fatal(err)
  587. }
  588. }
  589. // grant the entire keys
  590. cx.user, cx.pass = "root", "root"
  591. if err := ctlV3RoleGrantPermission(cx, "test-role", grantingPerm{true, true, "", "\x00", false}); err != nil {
  592. cx.t.Fatal(err)
  593. }
  594. // try keys, of course it must be allowed because test-role has a permission of the entire keys
  595. cx.user, cx.pass = "test-user", "pass"
  596. for i := 0; i < 10; i++ {
  597. key := fmt.Sprintf("z%d", i)
  598. if err := ctlV3Put(cx, key, "val", ""); err != nil {
  599. cx.t.Fatal(err)
  600. }
  601. }
  602. // revoke the entire keys
  603. cx.user, cx.pass = "root", "root"
  604. if err := ctlV3RoleRevokePermission(cx, "test-role", "", "", true); err != nil {
  605. cx.t.Fatal(err)
  606. }
  607. // try the revoked entire key permission
  608. cx.user, cx.pass = "test-user", "pass"
  609. for i := 0; i < 10; i++ {
  610. key := fmt.Sprintf("z%d", i)
  611. if err := ctlV3PutFailPerm(cx, key, "val"); err != nil {
  612. cx.t.Fatal(err)
  613. }
  614. }
  615. }
  616. func authTestWatch(cx ctlCtx) {
  617. if err := authEnable(cx); err != nil {
  618. cx.t.Fatal(err)
  619. }
  620. cx.user, cx.pass = "root", "root"
  621. authSetupTestUser(cx)
  622. // grant a key range
  623. if err := ctlV3RoleGrantPermission(cx, "test-role", grantingPerm{true, true, "key", "key4", false}); err != nil {
  624. cx.t.Fatal(err)
  625. }
  626. tests := []struct {
  627. puts []kv
  628. args []string
  629. wkv []kv
  630. want bool
  631. }{
  632. { // watch 1 key, should be successful
  633. []kv{{"key", "value"}},
  634. []string{"key", "--rev", "1"},
  635. []kv{{"key", "value"}},
  636. true,
  637. },
  638. { // watch 3 keys by range, should be successful
  639. []kv{{"key1", "val1"}, {"key3", "val3"}, {"key2", "val2"}},
  640. []string{"key", "key3", "--rev", "1"},
  641. []kv{{"key1", "val1"}, {"key2", "val2"}},
  642. true,
  643. },
  644. { // watch 1 key, should not be successful
  645. []kv{},
  646. []string{"key5", "--rev", "1"},
  647. []kv{},
  648. false,
  649. },
  650. { // watch 3 keys by range, should not be successful
  651. []kv{},
  652. []string{"key", "key6", "--rev", "1"},
  653. []kv{},
  654. false,
  655. },
  656. }
  657. cx.user, cx.pass = "test-user", "pass"
  658. for i, tt := range tests {
  659. donec := make(chan struct{})
  660. go func(i int, puts []kv) {
  661. defer close(donec)
  662. for j := range puts {
  663. if err := ctlV3Put(cx, puts[j].key, puts[j].val, ""); err != nil {
  664. cx.t.Fatalf("watchTest #%d-%d: ctlV3Put error (%v)", i, j, err)
  665. }
  666. }
  667. }(i, tt.puts)
  668. var err error
  669. if tt.want {
  670. err = ctlV3Watch(cx, tt.args, tt.wkv...)
  671. } else {
  672. err = ctlV3WatchFailPerm(cx, tt.args)
  673. }
  674. if err != nil {
  675. if cx.dialTimeout > 0 && !isGRPCTimedout(err) {
  676. cx.t.Errorf("watchTest #%d: ctlV3Watch error (%v)", i, err)
  677. }
  678. }
  679. <-donec
  680. }
  681. }
  682. func authTestRoleGet(cx ctlCtx) {
  683. if err := authEnable(cx); err != nil {
  684. cx.t.Fatal(err)
  685. }
  686. cx.user, cx.pass = "root", "root"
  687. authSetupTestUser(cx)
  688. expected := []string{
  689. "Role test-role",
  690. "KV Read:", "foo",
  691. "KV Write:", "foo",
  692. }
  693. if err := spawnWithExpects(append(cx.PrefixArgs(), "role", "get", "test-role"), expected...); err != nil {
  694. cx.t.Fatal(err)
  695. }
  696. // test-user can get the information of test-role because it belongs to the role
  697. cx.user, cx.pass = "test-user", "pass"
  698. if err := spawnWithExpects(append(cx.PrefixArgs(), "role", "get", "test-role"), expected...); err != nil {
  699. cx.t.Fatal(err)
  700. }
  701. // test-user cannot get the information of root because it doesn't belong to the role
  702. expected = []string{
  703. "Error: etcdserver: permission denied",
  704. }
  705. if err := spawnWithExpects(append(cx.PrefixArgs(), "role", "get", "root"), expected...); err != nil {
  706. cx.t.Fatal(err)
  707. }
  708. }
  709. func authTestUserGet(cx ctlCtx) {
  710. if err := authEnable(cx); err != nil {
  711. cx.t.Fatal(err)
  712. }
  713. cx.user, cx.pass = "root", "root"
  714. authSetupTestUser(cx)
  715. expected := []string{
  716. "User: test-user",
  717. "Roles: test-role",
  718. }
  719. if err := spawnWithExpects(append(cx.PrefixArgs(), "user", "get", "test-user"), expected...); err != nil {
  720. cx.t.Fatal(err)
  721. }
  722. // test-user can get the information of test-user itself
  723. cx.user, cx.pass = "test-user", "pass"
  724. if err := spawnWithExpects(append(cx.PrefixArgs(), "user", "get", "test-user"), expected...); err != nil {
  725. cx.t.Fatal(err)
  726. }
  727. // test-user cannot get the information of root
  728. expected = []string{
  729. "Error: etcdserver: permission denied",
  730. }
  731. if err := spawnWithExpects(append(cx.PrefixArgs(), "user", "get", "root"), expected...); err != nil {
  732. cx.t.Fatal(err)
  733. }
  734. }
  735. func authTestRoleList(cx ctlCtx) {
  736. if err := authEnable(cx); err != nil {
  737. cx.t.Fatal(err)
  738. }
  739. cx.user, cx.pass = "root", "root"
  740. authSetupTestUser(cx)
  741. if err := spawnWithExpect(append(cx.PrefixArgs(), "role", "list"), "test-role"); err != nil {
  742. cx.t.Fatal(err)
  743. }
  744. }
  745. func authTestDefrag(cx ctlCtx) {
  746. maintenanceInitKeys(cx)
  747. if err := authEnable(cx); err != nil {
  748. cx.t.Fatal(err)
  749. }
  750. cx.user, cx.pass = "root", "root"
  751. authSetupTestUser(cx)
  752. // ordinary user cannot defrag
  753. cx.user, cx.pass = "test-user", "pass"
  754. if err := ctlV3Defrag(cx); err == nil {
  755. cx.t.Fatal("ordinary user should not be able to issue a defrag request")
  756. }
  757. // root can defrag
  758. cx.user, cx.pass = "root", "root"
  759. if err := ctlV3Defrag(cx); err != nil {
  760. cx.t.Fatal(err)
  761. }
  762. }
  763. func authTestSnapshot(cx ctlCtx) {
  764. maintenanceInitKeys(cx)
  765. if err := authEnable(cx); err != nil {
  766. cx.t.Fatal(err)
  767. }
  768. cx.user, cx.pass = "root", "root"
  769. authSetupTestUser(cx)
  770. fpath := "test.snapshot"
  771. defer os.RemoveAll(fpath)
  772. // ordinary user cannot save a snapshot
  773. cx.user, cx.pass = "test-user", "pass"
  774. if err := ctlV3SnapshotSave(cx, fpath); err == nil {
  775. cx.t.Fatal("ordinary user should not be able to save a snapshot")
  776. }
  777. // root can save a snapshot
  778. cx.user, cx.pass = "root", "root"
  779. if err := ctlV3SnapshotSave(cx, fpath); err != nil {
  780. cx.t.Fatalf("snapshotTest ctlV3SnapshotSave error (%v)", err)
  781. }
  782. st, err := getSnapshotStatus(cx, fpath)
  783. if err != nil {
  784. cx.t.Fatalf("snapshotTest getSnapshotStatus error (%v)", err)
  785. }
  786. if st.Revision != 4 {
  787. cx.t.Fatalf("expected 4, got %d", st.Revision)
  788. }
  789. if st.TotalKey < 3 {
  790. cx.t.Fatalf("expected at least 3, got %d", st.TotalKey)
  791. }
  792. }
  793. func authTestEndpointHealth(cx ctlCtx) {
  794. if err := authEnable(cx); err != nil {
  795. cx.t.Fatal(err)
  796. }
  797. cx.user, cx.pass = "root", "root"
  798. authSetupTestUser(cx)
  799. if err := ctlV3EndpointHealth(cx); err != nil {
  800. cx.t.Fatalf("endpointStatusTest ctlV3EndpointHealth error (%v)", err)
  801. }
  802. // health checking with an ordinary user "succeeds" since permission denial goes through consensus
  803. cx.user, cx.pass = "test-user", "pass"
  804. if err := ctlV3EndpointHealth(cx); err != nil {
  805. cx.t.Fatalf("endpointStatusTest ctlV3EndpointHealth error (%v)", err)
  806. }
  807. // succeed if permissions granted for ordinary user
  808. cx.user, cx.pass = "root", "root"
  809. if err := ctlV3RoleGrantPermission(cx, "test-role", grantingPerm{true, true, "health", "", false}); err != nil {
  810. cx.t.Fatal(err)
  811. }
  812. cx.user, cx.pass = "test-user", "pass"
  813. if err := ctlV3EndpointHealth(cx); err != nil {
  814. cx.t.Fatalf("endpointStatusTest ctlV3EndpointHealth error (%v)", err)
  815. }
  816. }
  817. func authTestCertCNAndUsername(cx ctlCtx) {
  818. if err := authEnable(cx); err != nil {
  819. cx.t.Fatal(err)
  820. }
  821. cx.user, cx.pass = "root", "root"
  822. authSetupTestUser(cx)
  823. if err := ctlV3User(cx, []string{"add", "example.com", "--interactive=false"}, "User example.com created", []string{""}); err != nil {
  824. cx.t.Fatal(err)
  825. }
  826. if err := spawnWithExpect(append(cx.PrefixArgs(), "role", "add", "test-role-cn"), "Role test-role-cn created"); err != nil {
  827. cx.t.Fatal(err)
  828. }
  829. if err := ctlV3User(cx, []string{"grant-role", "example.com", "test-role-cn"}, "Role test-role-cn is granted to user example.com", nil); err != nil {
  830. cx.t.Fatal(err)
  831. }
  832. // grant a new key for CN based user
  833. if err := ctlV3RoleGrantPermission(cx, "test-role-cn", grantingPerm{true, true, "hoo", "", false}); err != nil {
  834. cx.t.Fatal(err)
  835. }
  836. // grant a new key for username based user
  837. if err := ctlV3RoleGrantPermission(cx, "test-role", grantingPerm{true, true, "bar", "", false}); err != nil {
  838. cx.t.Fatal(err)
  839. }
  840. // try a granted key for CN based user
  841. cx.user, cx.pass = "", ""
  842. if err := ctlV3Put(cx, "hoo", "bar", ""); err != nil {
  843. cx.t.Error(err)
  844. }
  845. // try a granted key for username based user
  846. cx.user, cx.pass = "test-user", "pass"
  847. if err := ctlV3Put(cx, "bar", "bar", ""); err != nil {
  848. cx.t.Error(err)
  849. }
  850. // try a non granted key for both of them
  851. cx.user, cx.pass = "", ""
  852. if err := ctlV3PutFailPerm(cx, "baz", "bar"); err != nil {
  853. cx.t.Error(err)
  854. }
  855. cx.user, cx.pass = "test-user", "pass"
  856. if err := ctlV3PutFailPerm(cx, "baz", "bar"); err != nil {
  857. cx.t.Error(err)
  858. }
  859. }