選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

LdapPublicKeyManagerTest.java 27KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723
  1. /*
  2. * Copyright 2016 Florian Zschocke
  3. * Copyright 2016 gitblit.com
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License");
  6. * you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. */
  17. package com.gitblit.tests;
  18. import static org.junit.Assume.assumeTrue;
  19. import java.security.GeneralSecurityException;
  20. import java.security.InvalidAlgorithmParameterException;
  21. import java.security.KeyPair;
  22. import java.security.KeyPairGenerator;
  23. import java.security.Signature;
  24. import java.security.spec.ECGenParameterSpec;
  25. import java.util.HashMap;
  26. import java.util.List;
  27. import java.util.Map;
  28. import org.apache.sshd.common.util.security.SecurityUtils;
  29. import org.junit.BeforeClass;
  30. import org.junit.Test;
  31. import org.junit.runner.RunWith;
  32. import org.junit.runners.Parameterized;
  33. import com.gitblit.Keys;
  34. import com.gitblit.Constants.AccessPermission;
  35. import com.gitblit.transport.ssh.LdapKeyManager;
  36. import com.gitblit.transport.ssh.SshKey;
  37. import com.unboundid.ldap.sdk.LDAPException;
  38. import com.unboundid.ldap.sdk.Modification;
  39. import com.unboundid.ldap.sdk.ModificationType;
  40. /**
  41. * Test LdapPublicKeyManager going against an in-memory UnboundID
  42. * LDAP server.
  43. *
  44. * @author Florian Zschocke
  45. *
  46. */
  47. @RunWith(Parameterized.class)
  48. public class LdapPublicKeyManagerTest extends LdapBasedUnitTest {
  49. private static Map<String,KeyPair> keyPairs = new HashMap<>(10);
  50. private static KeyPairGenerator rsaGenerator;
  51. private static KeyPairGenerator dsaGenerator;
  52. private static KeyPairGenerator ecGenerator;
  53. @BeforeClass
  54. public static void init() throws GeneralSecurityException {
  55. rsaGenerator = SecurityUtils.getKeyPairGenerator("RSA");
  56. dsaGenerator = SecurityUtils.getKeyPairGenerator("DSA");
  57. ecGenerator = SecurityUtils.getKeyPairGenerator("ECDSA");
  58. }
  59. @Test
  60. public void testGetKeys() throws LDAPException {
  61. String keyRsaOne = getRsaPubKey("UserOne@example.com");
  62. getDS().modify(DN_USER_ONE, new Modification(ModificationType.ADD, "sshPublicKey", keyRsaOne));
  63. String keyRsaTwo = getRsaPubKey("UserTwo@example.com");
  64. String keyDsaTwo = getDsaPubKey("UserTwo@example.com");
  65. getDS().modify(DN_USER_TWO, new Modification(ModificationType.ADD, "sshPublicKey", keyRsaTwo, keyDsaTwo));
  66. String keyRsaThree = getRsaPubKey("UserThree@example.com");
  67. String keyDsaThree = getDsaPubKey("UserThree@example.com");
  68. String keyEcThree = getEcPubKey("UserThree@example.com");
  69. getDS().modify(DN_USER_THREE, new Modification(ModificationType.ADD, "sshPublicKey", keyEcThree, keyRsaThree, keyDsaThree));
  70. LdapKeyManager kmgr = new LdapKeyManager(settings);
  71. List<SshKey> keys = kmgr.getKeys("UserOne");
  72. assertNotNull(keys);
  73. assertTrue(keys.size() == 1);
  74. assertEquals(keyRsaOne, keys.get(0).getRawData());
  75. keys = kmgr.getKeys("UserTwo");
  76. assertNotNull(keys);
  77. assertTrue(keys.size() == 2);
  78. if (keyRsaTwo.equals(keys.get(0).getRawData())) {
  79. assertEquals(keyDsaTwo, keys.get(1).getRawData());
  80. } else if (keyDsaTwo.equals(keys.get(0).getRawData())) {
  81. assertEquals(keyRsaTwo, keys.get(1).getRawData());
  82. } else {
  83. fail("Mismatch in UserTwo keys.");
  84. }
  85. keys = kmgr.getKeys("UserThree");
  86. assertNotNull(keys);
  87. assertTrue(keys.size() == 3);
  88. assertEquals(keyEcThree, keys.get(0).getRawData());
  89. assertEquals(keyRsaThree, keys.get(1).getRawData());
  90. assertEquals(keyDsaThree, keys.get(2).getRawData());
  91. keys = kmgr.getKeys("UserFour");
  92. assertNotNull(keys);
  93. assertTrue(keys.size() == 0);
  94. }
  95. @Test
  96. public void testGetKeysAttributeName() throws LDAPException {
  97. settings.put(Keys.realm.ldap.sshPublicKey, "sshPublicKey");
  98. String keyRsaOne = getRsaPubKey("UserOne@example.com");
  99. getDS().modify(DN_USER_ONE, new Modification(ModificationType.ADD, "sshPublicKey", keyRsaOne));
  100. String keyDsaTwo = getDsaPubKey("UserTwo@example.com");
  101. getDS().modify(DN_USER_TWO, new Modification(ModificationType.ADD, "publicsshkey", keyDsaTwo));
  102. String keyRsaThree = getRsaPubKey("UserThree@example.com");
  103. String keyDsaThree = getDsaPubKey("UserThree@example.com");
  104. getDS().modify(DN_USER_THREE, new Modification(ModificationType.ADD, "sshPublicKey", keyRsaThree));
  105. getDS().modify(DN_USER_THREE, new Modification(ModificationType.ADD, "publicsshkey", keyDsaThree));
  106. LdapKeyManager kmgr = new LdapKeyManager(settings);
  107. List<SshKey> keys = kmgr.getKeys("UserOne");
  108. assertNotNull(keys);
  109. assertEquals(1, keys.size());
  110. assertEquals(keyRsaOne, keys.get(0).getRawData());
  111. keys = kmgr.getKeys("UserTwo");
  112. assertNotNull(keys);
  113. assertEquals(0, keys.size());
  114. keys = kmgr.getKeys("UserThree");
  115. assertNotNull(keys);
  116. assertEquals(1, keys.size());
  117. assertEquals(keyRsaThree, keys.get(0).getRawData());
  118. keys = kmgr.getKeys("UserFour");
  119. assertNotNull(keys);
  120. assertEquals(0, keys.size());
  121. settings.put(Keys.realm.ldap.sshPublicKey, "publicsshkey");
  122. keys = kmgr.getKeys("UserOne");
  123. assertNotNull(keys);
  124. assertEquals(0, keys.size());
  125. keys = kmgr.getKeys("UserTwo");
  126. assertNotNull(keys);
  127. assertEquals(1, keys.size());
  128. assertEquals(keyDsaTwo, keys.get(0).getRawData());
  129. keys = kmgr.getKeys("UserThree");
  130. assertNotNull(keys);
  131. assertEquals(1, keys.size());
  132. assertEquals(keyDsaThree, keys.get(0).getRawData());
  133. keys = kmgr.getKeys("UserFour");
  134. assertNotNull(keys);
  135. assertEquals(0, keys.size());
  136. }
  137. @Test
  138. public void testGetKeysPrefixed() throws LDAPException {
  139. // This test is independent from authentication mode, so run only once.
  140. assumeTrue(authMode == AuthMode.ANONYMOUS);
  141. String keyRsaOne = getRsaPubKey("UserOne@example.com");
  142. getDS().modify(DN_USER_ONE, new Modification(ModificationType.ADD, "sshPublicKey", keyRsaOne));
  143. String keyRsaTwo = getRsaPubKey("UserTwo@example.com");
  144. String keyDsaTwo = getDsaPubKey("UserTwo@example.com");
  145. getDS().modify(DN_USER_TWO, new Modification(ModificationType.ADD, "altSecurityIdentities", keyRsaTwo));
  146. getDS().modify(DN_USER_TWO, new Modification(ModificationType.ADD, "altSecurityIdentities", "SSHKey: " + keyDsaTwo));
  147. String keyRsaThree = getRsaPubKey("UserThree@example.com");
  148. String keyDsaThree = getDsaPubKey("UserThree@example.com");
  149. String keyEcThree = getEcPubKey("UserThree@example.com");
  150. getDS().modify(DN_USER_THREE, new Modification(ModificationType.ADD, "altSecurityIdentities", " SshKey :\r\n" + keyRsaThree));
  151. getDS().modify(DN_USER_THREE, new Modification(ModificationType.ADD, "altSecurityIdentities", " sshkey: " + keyDsaThree));
  152. getDS().modify(DN_USER_THREE, new Modification(ModificationType.ADD, "altSecurityIdentities", "ECDSAKey :\n " + keyEcThree));
  153. LdapKeyManager kmgr = new LdapKeyManager(settings);
  154. settings.put(Keys.realm.ldap.sshPublicKey, "altSecurityIdentities");
  155. List<SshKey> keys = kmgr.getKeys("UserOne");
  156. assertNotNull(keys);
  157. assertEquals(0, keys.size());
  158. keys = kmgr.getKeys("UserTwo");
  159. assertNotNull(keys);
  160. assertEquals(1, keys.size());
  161. assertEquals(keyRsaTwo, keys.get(0).getRawData());
  162. keys = kmgr.getKeys("UserThree");
  163. assertNotNull(keys);
  164. assertEquals(0, keys.size());
  165. keys = kmgr.getKeys("UserFour");
  166. assertNotNull(keys);
  167. assertEquals(0, keys.size());
  168. settings.put(Keys.realm.ldap.sshPublicKey, "altSecurityIdentities:SSHKey");
  169. keys = kmgr.getKeys("UserOne");
  170. assertNotNull(keys);
  171. assertEquals(0, keys.size());
  172. keys = kmgr.getKeys("UserTwo");
  173. assertNotNull(keys);
  174. assertEquals(1, keys.size());
  175. assertEquals(keyDsaTwo, keys.get(0).getRawData());
  176. keys = kmgr.getKeys("UserThree");
  177. assertNotNull(keys);
  178. assertEquals(2, keys.size());
  179. assertEquals(keyRsaThree, keys.get(0).getRawData());
  180. assertEquals(keyDsaThree, keys.get(1).getRawData());
  181. keys = kmgr.getKeys("UserFour");
  182. assertNotNull(keys);
  183. assertEquals(0, keys.size());
  184. settings.put(Keys.realm.ldap.sshPublicKey, "altSecurityIdentities:ECDSAKey");
  185. keys = kmgr.getKeys("UserOne");
  186. assertNotNull(keys);
  187. assertEquals(0, keys.size());
  188. keys = kmgr.getKeys("UserTwo");
  189. assertNotNull(keys);
  190. assertEquals(0, keys.size());
  191. keys = kmgr.getKeys("UserThree");
  192. assertNotNull(keys);
  193. assertEquals(1, keys.size());
  194. assertEquals(keyEcThree, keys.get(0).getRawData());
  195. keys = kmgr.getKeys("UserFour");
  196. assertNotNull(keys);
  197. assertEquals(0, keys.size());
  198. }
  199. @Test
  200. public void testGetKeysPermissions() throws LDAPException {
  201. // This test is independent from authentication mode, so run only once.
  202. assumeTrue(authMode == AuthMode.ANONYMOUS);
  203. String keyRsaOne = getRsaPubKey("UserOne@example.com");
  204. String keyRsaTwo = getRsaPubKey("");
  205. String keyDsaTwo = getDsaPubKey("UserTwo at example.com");
  206. String keyRsaThree = getRsaPubKey("UserThree@example.com");
  207. String keyDsaThree = getDsaPubKey("READ key for user 'Three' @example.com");
  208. String keyEcThree = getEcPubKey("UserThree@example.com");
  209. getDS().modify(DN_USER_ONE, new Modification(ModificationType.ADD, "sshPublicKey", keyRsaOne));
  210. getDS().modify(DN_USER_ONE, new Modification(ModificationType.ADD, "sshPublicKey", " " + keyRsaTwo));
  211. getDS().modify(DN_USER_ONE, new Modification(ModificationType.ADD, "sshPublicKey", "no-agent-forwarding " + keyDsaTwo));
  212. getDS().modify(DN_USER_ONE, new Modification(ModificationType.ADD, "sshPublicKey", " command=\"sh /etc/netstart tun0 \" " + keyRsaThree));
  213. getDS().modify(DN_USER_ONE, new Modification(ModificationType.ADD, "sshPublicKey", " command=\"netstat -nult\",environment=\"gb=\\\"What now\\\"\" " + keyDsaThree));
  214. getDS().modify(DN_USER_ONE, new Modification(ModificationType.ADD, "sshPublicKey", "environment=\"SSH=git\",command=\"netstat -nult\",environment=\"gbPerms=VIEW\" " + keyEcThree));
  215. getDS().modify(DN_USER_TWO, new Modification(ModificationType.ADD, "sshPublicKey", "environment=\"gbPerm=R\" " + keyRsaOne));
  216. getDS().modify(DN_USER_TWO, new Modification(ModificationType.ADD, "sshPublicKey", " restrict,environment=\"gbperm=V\" " + keyRsaTwo));
  217. getDS().modify(DN_USER_TWO, new Modification(ModificationType.ADD, "sshPublicKey", "restrict,environment=\"GBPerm=RW\",pty " + keyDsaTwo));
  218. getDS().modify(DN_USER_TWO, new Modification(ModificationType.ADD, "sshPublicKey", " environment=\"gbPerm=CLONE\",environment=\"X=\\\" Y \\\"\" " + keyRsaThree));
  219. getDS().modify(DN_USER_TWO, new Modification(ModificationType.ADD, "sshPublicKey", " environment=\"A = B \",from=\"*.example.com,!pc.example.com\",environment=\"gbPerm=VIEW\" " + keyDsaThree));
  220. getDS().modify(DN_USER_TWO, new Modification(ModificationType.ADD, "sshPublicKey", "environment=\"SSH=git\",environment=\"gbPerm=PUSH\",environment=\"XYZ='Ali Baba'\" " + keyEcThree));
  221. getDS().modify(DN_USER_THREE, new Modification(ModificationType.ADD, "sshPublicKey", "environment=\"gbPerm=R\",environment=\"josh=\\\"mean\\\"\",tunnel=\"0\" " + keyRsaOne));
  222. getDS().modify(DN_USER_THREE, new Modification(ModificationType.ADD, "sshPublicKey", " environment=\" gbPerm = V \" " + keyRsaTwo));
  223. getDS().modify(DN_USER_THREE, new Modification(ModificationType.ADD, "sshPublicKey", "command=\"sh echo \\\"Nope, not you!\\\" \",user-rc,environment=\"gbPerm=RW\" " + keyDsaTwo));
  224. getDS().modify(DN_USER_THREE, new Modification(ModificationType.ADD, "sshPublicKey", "environment=\"gbPerm=VIEW\",command=\"sh /etc/netstart tun0 \",environment=\"gbPerm=CLONE\",no-pty " + keyRsaThree));
  225. getDS().modify(DN_USER_THREE, new Modification(ModificationType.ADD, "sshPublicKey", " command=\"netstat -nult\",environment=\"gbPerm=VIEW\" " + keyDsaThree));
  226. getDS().modify(DN_USER_THREE, new Modification(ModificationType.ADD, "sshPublicKey", "environment=\"SSH=git\",command=\"netstat -nult\",environment=\"gbPerm=PUSH\" " + keyEcThree));
  227. LdapKeyManager kmgr = new LdapKeyManager(settings);
  228. List<SshKey> keys = kmgr.getKeys("UserOne");
  229. assertNotNull(keys);
  230. assertEquals(6, keys.size());
  231. for (SshKey key : keys) {
  232. assertEquals(AccessPermission.PUSH, key.getPermission());
  233. }
  234. keys = kmgr.getKeys("UserTwo");
  235. assertNotNull(keys);
  236. assertEquals(6, keys.size());
  237. int seen = 0;
  238. for (SshKey key : keys) {
  239. if (keyRsaOne.equals(key.getRawData())) {
  240. assertEquals(AccessPermission.CLONE, key.getPermission());
  241. seen += 1 << 0;
  242. }
  243. else if (keyRsaTwo.equals(key.getRawData())) {
  244. assertEquals(AccessPermission.VIEW, key.getPermission());
  245. seen += 1 << 1;
  246. }
  247. else if (keyDsaTwo.equals(key.getRawData())) {
  248. assertEquals(AccessPermission.PUSH, key.getPermission());
  249. seen += 1 << 2;
  250. }
  251. else if (keyRsaThree.equals(key.getRawData())) {
  252. assertEquals(AccessPermission.CLONE, key.getPermission());
  253. seen += 1 << 3;
  254. }
  255. else if (keyDsaThree.equals(key.getRawData())) {
  256. assertEquals(AccessPermission.VIEW, key.getPermission());
  257. seen += 1 << 4;
  258. }
  259. else if (keyEcThree.equals(key.getRawData())) {
  260. assertEquals(AccessPermission.PUSH, key.getPermission());
  261. seen += 1 << 5;
  262. }
  263. }
  264. assertEquals(63, seen);
  265. keys = kmgr.getKeys("UserThree");
  266. assertNotNull(keys);
  267. assertEquals(6, keys.size());
  268. seen = 0;
  269. for (SshKey key : keys) {
  270. if (keyRsaOne.equals(key.getRawData())) {
  271. assertEquals(AccessPermission.CLONE, key.getPermission());
  272. seen += 1 << 0;
  273. }
  274. else if (keyRsaTwo.equals(key.getRawData())) {
  275. assertEquals(AccessPermission.VIEW, key.getPermission());
  276. seen += 1 << 1;
  277. }
  278. else if (keyDsaTwo.equals(key.getRawData())) {
  279. assertEquals(AccessPermission.PUSH, key.getPermission());
  280. seen += 1 << 2;
  281. }
  282. else if (keyRsaThree.equals(key.getRawData())) {
  283. assertEquals(AccessPermission.CLONE, key.getPermission());
  284. seen += 1 << 3;
  285. }
  286. else if (keyDsaThree.equals(key.getRawData())) {
  287. assertEquals(AccessPermission.VIEW, key.getPermission());
  288. seen += 1 << 4;
  289. }
  290. else if (keyEcThree.equals(key.getRawData())) {
  291. assertEquals(AccessPermission.PUSH, key.getPermission());
  292. seen += 1 << 5;
  293. }
  294. }
  295. assertEquals(63, seen);
  296. }
  297. @Test
  298. public void testGetKeysPrefixedPermissions() throws LDAPException {
  299. // This test is independent from authentication mode, so run only once.
  300. assumeTrue(authMode == AuthMode.ANONYMOUS);
  301. String keyRsaOne = getRsaPubKey("UserOne@example.com");
  302. String keyRsaTwo = getRsaPubKey("UserTwo at example.com");
  303. String keyDsaTwo = getDsaPubKey("UserTwo@example.com");
  304. String keyRsaThree = getRsaPubKey("example.com: user Three");
  305. String keyDsaThree = getDsaPubKey("");
  306. String keyEcThree = getEcPubKey(" ");
  307. getDS().modify(DN_USER_ONE, new Modification(ModificationType.ADD, "altSecurityIdentities", "permitopen=\"host:220\"" + keyRsaOne));
  308. getDS().modify(DN_USER_ONE, new Modification(ModificationType.ADD, "altSecurityIdentities", "sshkey:" + " " + keyRsaTwo));
  309. getDS().modify(DN_USER_ONE, new Modification(ModificationType.ADD, "altSecurityIdentities", "SSHKEY :" + "no-agent-forwarding " + keyDsaTwo));
  310. getDS().modify(DN_USER_ONE, new Modification(ModificationType.ADD, "altSecurityIdentities", "pubkey: " + " command=\"sh /etc/netstart tun0 \" " + keyRsaThree));
  311. getDS().modify(DN_USER_ONE, new Modification(ModificationType.ADD, "altSecurityIdentities", "pubkey: " + " command=\"netstat -nult\",environment=\"gb=\\\"What now\\\"\" " + keyDsaThree));
  312. getDS().modify(DN_USER_ONE, new Modification(ModificationType.ADD, "altSecurityIdentities", "pubkey: " + "environment=\"SSH=git\",command=\"netstat -nult\",environment=\"gbPerms=VIEW\" " + keyEcThree));
  313. getDS().modify(DN_USER_TWO, new Modification(ModificationType.ADD, "altSecurityIdentities", "SSHkey: " + "environment=\"gbPerm=R\" " + keyRsaOne));
  314. getDS().modify(DN_USER_TWO, new Modification(ModificationType.ADD, "altSecurityIdentities", "SSHKey : " + " restrict,environment=\"gbPerm=V\",permitopen=\"sshkey: 220\" " + keyRsaTwo));
  315. getDS().modify(DN_USER_TWO, new Modification(ModificationType.ADD, "altSecurityIdentities", "SSHkey: " + "permitopen=\"sshkey: 443\",restrict,environment=\"gbPerm=RW\",pty " + keyDsaTwo));
  316. getDS().modify(DN_USER_TWO, new Modification(ModificationType.ADD, "altSecurityIdentities", "pubkey: " + "environment=\"gbPerm=CLONE\",permitopen=\"pubkey: 29184\",environment=\"X=\\\" Y \\\"\" " + keyRsaThree));
  317. getDS().modify(DN_USER_TWO, new Modification(ModificationType.ADD, "altSecurityIdentities", "pubkey: " + " environment=\"A = B \",from=\"*.example.com,!pc.example.com\",environment=\"gbPerm=VIEW\" " + keyDsaThree));
  318. getDS().modify(DN_USER_TWO, new Modification(ModificationType.ADD, "altSecurityIdentities", "pubkey: " + "environment=\"SSH=git\",environment=\"gbPerm=PUSH\",environemnt=\"XYZ='Ali Baba'\" " + keyEcThree));
  319. getDS().modify(DN_USER_THREE, new Modification(ModificationType.ADD, "altSecurityIdentities", "SSHkey: " + "environment=\"gbPerm=R\",environment=\"josh=\\\"mean\\\"\",tunnel=\"0\" " + keyRsaOne));
  320. getDS().modify(DN_USER_THREE, new Modification(ModificationType.ADD, "altSecurityIdentities", "SSHkey : " + " environment=\" gbPerm = V \" " + keyRsaTwo));
  321. getDS().modify(DN_USER_THREE, new Modification(ModificationType.ADD, "altSecurityIdentities", "SSHkey: " + "command=\"sh echo \\\"Nope, not you! \\b (bell)\\\" \",user-rc,environment=\"gbPerm=RW\" " + keyDsaTwo));
  322. getDS().modify(DN_USER_THREE, new Modification(ModificationType.ADD, "altSecurityIdentities", "pubkey: " + "environment=\"gbPerm=VIEW\",command=\"sh /etc/netstart tun0 \",environment=\"gbPerm=CLONE\",no-pty " + keyRsaThree));
  323. getDS().modify(DN_USER_THREE, new Modification(ModificationType.ADD, "altSecurityIdentities", "pubkey: " + " command=\"netstat -nult\",environment=\"gbPerm=VIEW\" " + keyDsaThree));
  324. getDS().modify(DN_USER_THREE, new Modification(ModificationType.ADD, "altSecurityIdentities", "pubkey: " + "environment=\"SSH=git\",command=\"netstat -nult\",environment=\"gbPerm=PUSH\" " + keyEcThree));
  325. // Weird stuff, not to specification but shouldn't make it stumble.
  326. getDS().modify(DN_USER_THREE, new Modification(ModificationType.ADD, "altSecurityIdentities", "opttest: " + "permitopen=host:443,command=,environment=\"gbPerm=CLONE\",no-pty= " + keyRsaThree));
  327. getDS().modify(DN_USER_THREE, new Modification(ModificationType.ADD, "altSecurityIdentities", " opttest: " + " cmd=git,environment=\"gbPerm=\\\"VIEW\\\"\" " + keyDsaThree));
  328. getDS().modify(DN_USER_THREE, new Modification(ModificationType.ADD, "altSecurityIdentities", " opttest:" + "environment=,command=netstat,environment=gbperm=push " + keyEcThree));
  329. LdapKeyManager kmgr = new LdapKeyManager(settings);
  330. settings.put(Keys.realm.ldap.sshPublicKey, "altSecurityIdentities:SSHkey");
  331. List<SshKey> keys = kmgr.getKeys("UserOne");
  332. assertNotNull(keys);
  333. assertEquals(2, keys.size());
  334. int seen = 0;
  335. for (SshKey key : keys) {
  336. assertEquals(AccessPermission.PUSH, key.getPermission());
  337. if (keyRsaOne.equals(key.getRawData())) {
  338. seen += 1 << 0;
  339. }
  340. else if (keyRsaTwo.equals(key.getRawData())) {
  341. seen += 1 << 1;
  342. }
  343. else if (keyDsaTwo.equals(key.getRawData())) {
  344. seen += 1 << 2;
  345. }
  346. else if (keyRsaThree.equals(key.getRawData())) {
  347. seen += 1 << 3;
  348. }
  349. else if (keyDsaThree.equals(key.getRawData())) {
  350. seen += 1 << 4;
  351. }
  352. else if (keyEcThree.equals(key.getRawData())) {
  353. seen += 1 << 5;
  354. }
  355. }
  356. assertEquals(6, seen);
  357. keys = kmgr.getKeys("UserTwo");
  358. assertNotNull(keys);
  359. assertEquals(3, keys.size());
  360. seen = 0;
  361. for (SshKey key : keys) {
  362. if (keyRsaOne.equals(key.getRawData())) {
  363. assertEquals(AccessPermission.CLONE, key.getPermission());
  364. seen += 1 << 0;
  365. }
  366. else if (keyRsaTwo.equals(key.getRawData())) {
  367. assertEquals(AccessPermission.VIEW, key.getPermission());
  368. seen += 1 << 1;
  369. }
  370. else if (keyDsaTwo.equals(key.getRawData())) {
  371. assertEquals(AccessPermission.PUSH, key.getPermission());
  372. seen += 1 << 2;
  373. }
  374. else if (keyRsaThree.equals(key.getRawData())) {
  375. assertEquals(AccessPermission.CLONE, key.getPermission());
  376. seen += 1 << 3;
  377. }
  378. else if (keyDsaThree.equals(key.getRawData())) {
  379. assertEquals(AccessPermission.VIEW, key.getPermission());
  380. seen += 1 << 4;
  381. }
  382. else if (keyEcThree.equals(key.getRawData())) {
  383. assertEquals(AccessPermission.PUSH, key.getPermission());
  384. seen += 1 << 5;
  385. }
  386. }
  387. assertEquals(7, seen);
  388. keys = kmgr.getKeys("UserThree");
  389. assertNotNull(keys);
  390. assertEquals(3, keys.size());
  391. seen = 0;
  392. for (SshKey key : keys) {
  393. if (keyRsaOne.equals(key.getRawData())) {
  394. assertEquals(AccessPermission.CLONE, key.getPermission());
  395. seen += 1 << 0;
  396. }
  397. else if (keyRsaTwo.equals(key.getRawData())) {
  398. assertEquals(AccessPermission.VIEW, key.getPermission());
  399. seen += 1 << 1;
  400. }
  401. else if (keyDsaTwo.equals(key.getRawData())) {
  402. assertEquals(AccessPermission.PUSH, key.getPermission());
  403. seen += 1 << 2;
  404. }
  405. else if (keyRsaThree.equals(key.getRawData())) {
  406. assertEquals(AccessPermission.CLONE, key.getPermission());
  407. seen += 1 << 3;
  408. }
  409. else if (keyDsaThree.equals(key.getRawData())) {
  410. assertEquals(AccessPermission.VIEW, key.getPermission());
  411. seen += 1 << 4;
  412. }
  413. else if (keyEcThree.equals(key.getRawData())) {
  414. assertEquals(AccessPermission.PUSH, key.getPermission());
  415. seen += 1 << 5;
  416. }
  417. }
  418. assertEquals(7, seen);
  419. settings.put(Keys.realm.ldap.sshPublicKey, "altSecurityIdentities:pubKey");
  420. keys = kmgr.getKeys("UserOne");
  421. assertNotNull(keys);
  422. assertEquals(3, keys.size());
  423. seen = 0;
  424. for (SshKey key : keys) {
  425. assertEquals(AccessPermission.PUSH, key.getPermission());
  426. if (keyRsaOne.equals(key.getRawData())) {
  427. seen += 1 << 0;
  428. }
  429. else if (keyRsaTwo.equals(key.getRawData())) {
  430. seen += 1 << 1;
  431. }
  432. else if (keyDsaTwo.equals(key.getRawData())) {
  433. seen += 1 << 2;
  434. }
  435. else if (keyRsaThree.equals(key.getRawData())) {
  436. seen += 1 << 3;
  437. }
  438. else if (keyDsaThree.equals(key.getRawData())) {
  439. seen += 1 << 4;
  440. }
  441. else if (keyEcThree.equals(key.getRawData())) {
  442. seen += 1 << 5;
  443. }
  444. }
  445. assertEquals(56, seen);
  446. keys = kmgr.getKeys("UserTwo");
  447. assertNotNull(keys);
  448. assertEquals(3, keys.size());
  449. seen = 0;
  450. for (SshKey key : keys) {
  451. if (keyRsaOne.equals(key.getRawData())) {
  452. assertEquals(AccessPermission.CLONE, key.getPermission());
  453. seen += 1 << 0;
  454. }
  455. else if (keyRsaTwo.equals(key.getRawData())) {
  456. assertEquals(AccessPermission.VIEW, key.getPermission());
  457. seen += 1 << 1;
  458. }
  459. else if (keyDsaTwo.equals(key.getRawData())) {
  460. assertEquals(AccessPermission.PUSH, key.getPermission());
  461. seen += 1 << 2;
  462. }
  463. else if (keyRsaThree.equals(key.getRawData())) {
  464. assertEquals(AccessPermission.CLONE, key.getPermission());
  465. seen += 1 << 3;
  466. }
  467. else if (keyDsaThree.equals(key.getRawData())) {
  468. assertEquals(AccessPermission.VIEW, key.getPermission());
  469. seen += 1 << 4;
  470. }
  471. else if (keyEcThree.equals(key.getRawData())) {
  472. assertEquals(AccessPermission.PUSH, key.getPermission());
  473. seen += 1 << 5;
  474. }
  475. }
  476. assertEquals(56, seen);
  477. keys = kmgr.getKeys("UserThree");
  478. assertNotNull(keys);
  479. assertEquals(3, keys.size());
  480. seen = 0;
  481. for (SshKey key : keys) {
  482. if (keyRsaOne.equals(key.getRawData())) {
  483. assertEquals(AccessPermission.CLONE, key.getPermission());
  484. seen += 1 << 0;
  485. }
  486. else if (keyRsaTwo.equals(key.getRawData())) {
  487. assertEquals(AccessPermission.VIEW, key.getPermission());
  488. seen += 1 << 1;
  489. }
  490. else if (keyDsaTwo.equals(key.getRawData())) {
  491. assertEquals(AccessPermission.PUSH, key.getPermission());
  492. seen += 1 << 2;
  493. }
  494. else if (keyRsaThree.equals(key.getRawData())) {
  495. assertEquals(AccessPermission.CLONE, key.getPermission());
  496. seen += 1 << 3;
  497. }
  498. else if (keyDsaThree.equals(key.getRawData())) {
  499. assertEquals(AccessPermission.VIEW, key.getPermission());
  500. seen += 1 << 4;
  501. }
  502. else if (keyEcThree.equals(key.getRawData())) {
  503. assertEquals(AccessPermission.PUSH, key.getPermission());
  504. seen += 1 << 5;
  505. }
  506. }
  507. assertEquals(56, seen);
  508. settings.put(Keys.realm.ldap.sshPublicKey, "altSecurityIdentities:opttest");
  509. keys = kmgr.getKeys("UserThree");
  510. assertNotNull(keys);
  511. assertEquals(3, keys.size());
  512. seen = 0;
  513. for (SshKey key : keys) {
  514. if (keyRsaOne.equals(key.getRawData())) {
  515. assertEquals(AccessPermission.CLONE, key.getPermission());
  516. seen += 1 << 0;
  517. }
  518. else if (keyRsaTwo.equals(key.getRawData())) {
  519. assertEquals(AccessPermission.VIEW, key.getPermission());
  520. seen += 1 << 1;
  521. }
  522. else if (keyDsaTwo.equals(key.getRawData())) {
  523. assertEquals(AccessPermission.PUSH, key.getPermission());
  524. seen += 1 << 2;
  525. }
  526. else if (keyRsaThree.equals(key.getRawData())) {
  527. assertEquals(AccessPermission.CLONE, key.getPermission());
  528. seen += 1 << 3;
  529. }
  530. else if (keyDsaThree.equals(key.getRawData())) {
  531. assertEquals(AccessPermission.VIEW, key.getPermission());
  532. seen += 1 << 4;
  533. }
  534. else if (keyEcThree.equals(key.getRawData())) {
  535. assertEquals(AccessPermission.PUSH, key.getPermission());
  536. seen += 1 << 5;
  537. }
  538. }
  539. assertEquals(56, seen);
  540. }
  541. @Test
  542. public void testKeyValidity() throws LDAPException, GeneralSecurityException {
  543. LdapKeyManager kmgr = new LdapKeyManager(settings);
  544. String comment = "UserTwo@example.com";
  545. String keyDsaTwo = getDsaPubKey(comment);
  546. getDS().modify(DN_USER_TWO, new Modification(ModificationType.ADD, "sshPublicKey", keyDsaTwo));
  547. List<SshKey> keys = kmgr.getKeys("UserTwo");
  548. assertNotNull(keys);
  549. assertEquals(1, keys.size());
  550. SshKey sshKey = keys.get(0);
  551. assertEquals(keyDsaTwo, sshKey.getRawData());
  552. Signature signature = SecurityUtils.getSignature("DSA");
  553. signature.initSign(getDsaKeyPair(comment).getPrivate());
  554. byte[] message = comment.getBytes();
  555. signature.update(message);
  556. byte[] sigBytes = signature.sign();
  557. signature.initVerify(sshKey.getPublicKey());
  558. signature.update(message);
  559. assertTrue("Verify failed with retrieved SSH key.", signature.verify(sigBytes));
  560. }
  561. private KeyPair getDsaKeyPair(String comment) {
  562. return getKeyPair("DSA", comment, dsaGenerator);
  563. }
  564. private KeyPair getKeyPair(String type, String comment, KeyPairGenerator generator) {
  565. String kpkey = type + ":" + comment;
  566. KeyPair kp = keyPairs.get(kpkey);
  567. if (kp == null) {
  568. if ("EC".equals(type)) {
  569. ECGenParameterSpec ecSpec = new ECGenParameterSpec("P-384");
  570. try {
  571. ecGenerator.initialize(ecSpec);
  572. } catch (InvalidAlgorithmParameterException e) {
  573. kp = generator.generateKeyPair();
  574. e.printStackTrace();
  575. }
  576. kp = ecGenerator.generateKeyPair();
  577. } else {
  578. kp = generator.generateKeyPair();
  579. }
  580. keyPairs.put(kpkey, kp);
  581. }
  582. return kp;
  583. }
  584. private String getRsaPubKey(String comment) {
  585. return getPubKey("RSA", comment, rsaGenerator);
  586. }
  587. private String getDsaPubKey(String comment) {
  588. return getPubKey("DSA", comment, dsaGenerator);
  589. }
  590. private String getEcPubKey(String comment) {
  591. return getPubKey("EC", comment, ecGenerator);
  592. }
  593. private String getPubKey(String type, String comment, KeyPairGenerator generator) {
  594. KeyPair kp = getKeyPair(type, comment, generator);
  595. if (kp == null) {
  596. return null;
  597. }
  598. SshKey sk = new SshKey(kp.getPublic());
  599. sk.setComment(comment);
  600. return sk.getRawData();
  601. }
  602. }