ã¢ããªã±ã¼ã·ã§ã³ã«ãããæ¨©éè¨è¨ã®èª²é¡
æ¥ã 権éè¨è¨ã§é ãæ±ãã¦ã¾ãããã®è¦æ©ãçµãããã¨ã¯ç¡ãã¨æã£ã¦ã¾ãããæ°ãã課é¡ã«ã¶ã¤ãã£ã¦ãããã¡ã«æåã®ããã®èª²é¡ãå¿ãã¦ãããããªã®ã§ãç¾æç¹ã§ã®èªåã®ä¸ã§ãã¡ããã¡ãã«ãªã£ã¦ããæ å ±ãã¾ã¨ãããã¨æããè¨äºã«ãã¾ããã
æã ã§ãã¡ãªãããããã¡ãªãããã«é¢é£ããæ å ±ãããã¾ããããã®ã¨ããã®ã¨ãã«ã¯è²ã ã¨æãããã¨ããã£ã¦ããããè¨äºã«ã¾ã¨ããã¨ãã«æãåºããªããã®ãå¤ã ããã¾ããããã£ã¼ãããã¯ãèªåã®çµé¨ãæãåºããªããéææ´æ°ããäºå®ã§ãã
- TL;DRï¼é·ããã¦èªã¿ãããªãï¼
- æ³å®ããèªè ãåæç¥è
- ãã®è¨äºã§ã®æ¨©éã¨ã¯
- 権éã®ç¨®é¡
- ã©ã®æ¨©éã¢ãã«ãæ¡ç¨ããã¹ãã
- 権éãé©ç¨ããå ´é¢
- 権éã®ã½ããã¦ã§ã¢ã¢ã¼ããã¯ãã£
- 権éãé©ç¨ï¼Enforceï¼ãã人
- 権éå®è£ ã®ã¢ããã¼ã
- 権éã¯ãã¸ãã¹ã«ã¼ã«ã®é¢å¿äºãªã®ã
- ã·ã¹ãã ã¢ã¼ããã¯ãã£
- ã¢ãã³ãªããã³ãã¨ã³ãã«ãããæ¸å¿µäºé
- 権éè¨è¨ã¯ã©ããç®æãããè¯ãã®ã
- æå¾ã«
- ãã®ä»åèæ å ±
TL;DRï¼é·ããã¦èªã¿ãããªãï¼
- 権éè¨è¨ã¯é£ããããã¹ããã©ã¯ãã£ã¹ãåºã¾ã£ã¦ããªã
- ãããä¸ã«æ£ãã°ã£ã¦ããæ å ±ãããéããªããBetterãªã¢ããã¼ãã追æ±ãç¶ããªãã¨ãããªã
- 権éè¨è¨ã®ãã¦ãã¦ããã£ã¨å ¬ã«å ±æããã¦ã»ãã
æ¬å½ã«é·ãè¨äºãªã®ã§ç®æ¬¡ã«æ°ã«ãªããããã¯ãããæ¹ã ãç¶ããèªãã§ãã ãããã¨ããã©ããææ³æã«ãªã£ã¦ãããããç¹ã«é¢ãã¦ã¯ããããããè©«ã³ç³ãä¸ãã¾ãã
ãã®è¨äºã¸ã®ãã£ã¼ãããã¯ã ã£ãããåã®ç¶ç¶çãªè¦æ©ããçã¾ããæ°ããªç¥èãã¢ãããã¼ããã¦ãããã¨ã§ãä»å¾æ¹åãããã¤ããã§ã¯ããã¾ãï¼
ã2023-08-14追è¨ã
ï¼å¹´ä»¥ä¸ãçµã¡ãã¹ããã©ã¯ãã£ã¹ãå¢ãã¦ããã®ã§ã以ä¸ã®è¨äºã§æ¨©éã®ã¢ã¼ããã¯ãã£ã«é¢ãã¦Authorization Academyã¨ããè¨äºã®å 容ããã¼ã¹ã«ã¾ã¨ãã¾ããããã²åããã¦èªãã§ã¿ã¦ãã ããã
æ³å®ããèªè ãåæç¥è
- APIè¨è¨ããããã¨ããã
- 権éãã©ããã£ã¦å®è£ ããã¹ããè¦ããã ãã¨ããã
- ã½ããã¦ã§ã¢ã¢ã¼ããã¯ãã£ã«ã¤ãã¦æèãã¦ãã
ãã®è¨äºã§ã®æ¨©éã¨ã¯
ãã®è¨äºã«ãããæ¨©éã¨ã¯ãã誰ãï¼Principalï¼ãããä½ã«ï¼Resourceï¼ãããä½ãï¼Actionï¼ããã¦è¯ãï¼Allowï¼ã®ãããããã¯ãã¦ã¯ãããªãï¼Denyï¼ã®ããå®ç¾©ãããã®ã«é¢ãã¦è¿°ã¹ã¦ãã¾ãã
ä¾ãã°Instagramãä¾ã«ã¨ãã¨ã
- ãã©ãã¼ãã¦ããäººã®æç¨¿ãåç §ãããã¨ãã§ãã
- èªåã®æç¨¿ã使ãããã¨ãã§ããï¼ä»äººã®æç¨¿ã¯ä½æã§ããªãï¼
- èªåã®æç¨¿ãåé¤ãããã¨ãã§ããï¼ä»äººã®æç¨¿ã¯åé¤ã§ããªãï¼
- èªåã®æç¨¿ã®ã¡ãã¥ã¼ã«ã¯ãåé¤ãã¡ãã¥ã¼ãããï¼ä»äººã®æç¨¿ã«ã¯ç¡ãï¼
ã®ãããªãã®ã§ãï¼ããªãã·ã³ãã«ãªä¾ãåºãã¾ããï¼ã
ã¢ããªã±ã¼ã·ã§ã³ãä½ãä¸ã§ã»ã¨ãã©ã®å ´åãããã観ç¹ã®æ¨©éãä½ãããç»å ´ããã¨æãã¾ãã
ã§ã¯ããã®ã権éããã©ããã£ã¦è¨è¨ã»å®è£ ããã¹ããªã®ãï¼ã¨ãããã¨ããã®è¨äºã®ã¡ã¤ã³ãããã¯ã§ãã
ééã£ãçè§£ã§æ¸ãã¦ããå 容ããããã¨æãã¾ãããä½ãããã®æ¹æ³ã§ãææããã ããã¨å¹¸ãã§ããï¼ãã®åã¾ãä¸ã¤æ¨©éã¬ãã«ãä¸ããæ°ããã¾ãï¼
権éã®ç¨®é¡
ã¾ããæ¨©éã¢ãã«ã«ã¯æ§ã ãªãã®ãããã¾ãããã®ä¸ã§ãACL, RBAC, ABACã«ã¤ãã¦è»½ãç´¹ä»ãããã¨æãã¾ãã
ä¸ã®è¨äºããããããã説æãã¦ããã®ã§ããè¦ç¹ã ãè¨ãã¨ä»¥ä¸ã®ã¨ããã§ãã
ACL(Access Control List)
ACLã¯ããã対象ï¼ããä¾ã«åºã¦ããã®ã¯ãã¡ã¤ã«ã ã£ãããã£ã¬ã¯ããªã ã£ããï¼ãã«å¯¾ãã¦å©ç¨è ã®ä½ããã®ã¢ã¯ã»ã¹æ¨©éããªã¹ãåãããã®ã§ãã
ãåå¼·ä¼ã§åºå¸è åç°¿ã«ååãããã°åå ã§ããã
ã¨ããããã«ãä¸è¦§ã«å ¥ã£ã¦ããã°OKã¨ãããããªã·ã³ãã«ãªå¶å¾¡ã§ãã
RBAC(Role-Based Access Control)
RBACã¯ãããã対象ï¼ä¾ãã°ã¦ã¼ã¶ã¼ï¼ãã«ããã¼ã«ï¼ä¸è¬ã¦ã¼ã¶ã¼ã»ç®¡çè ãªã©ï¼ãã¨ããæ¦å¿µãå²å½ã¦ãããããã«ãããã®ã§ãããã®ãã¼ã«ã«å¯¾ãã¦ããä½ãã§ããããã¨ããã®ãä»ä¸ãããããã«ãªãã¾ãã
ãåå¼·ä¼ã®ä¸è¬åå è ã¯GUESTã«ã¼ããæ¸¡ãããéå¶å´ã®äººã¯STAFFã«ã¼ããæ¸¡ããããSTAFFã«ã¼ããæã£ã¦ãã人ã¯ç¹å®ã®é¨å±ã«å ¥ããã¨ãã§ãããã
ã¨ããããã«ç¹å®ã®ãã¼ã«ã«ãç¹å®ã®è¡å許å¯ãä»ä¸ããããããªã¤ã¡ã¼ã¸ã§ãã
ABAC(Attribute-Based Access Control)
ABACã¯ããã«ãã䏿©å ã«ããã¾ããABACã®AãAttributeï¼å±æ§ï¼ã§ããããã«ãããã対象ã®å±æ§ããèæ ®ãã¦ãä½ãã§ãããããæ±ºãããã¨ãã§ãã¾ãã
ãAãããBãããåå¼·ä¼ã«åå ãã¾ãããAããã¯20æ³ãªã®ã§æè¦ªä¼ã§ãé ã飲ãã¾ãããBããã¯18æ³ãªã®ã§æè¦ªä¼ã§ãé ã飲ãã¾ãããã
ã¨ããããã«ãããã対象ï¼AãããBããï¼ãã®ã屿§ï¼å¹´é½¢ï¼ãã«çç®ãã¦ãä½ãã§ãããï¼ãé ã飲ãããï¼ããæ±ºãããã¨ãã§ãã¾ãã
ã©ã®æ¨©éã¢ãã«ãæ¡ç¨ããã¹ãã
3ã¤ã®æ¨©éã¢ãã«ãç´¹ä»ãã¾ããããä»ã«ãè²ã ã¨ããã¾ããã©ã®æ¨©éã¢ãã«ãæ¡ç¨ããã¹ããªãã§ãããï¼ããããã§ããããããã®ã¡ãªããã»ãã¡ãªãããããã®ã§ãIt dependsãã§ããä¸ã§ç´¹ä»ããä¸ã§ã¯ABACãæãæè»ã§ããããã®åå®è£ ããã®ã大å¤ã«ãªãã¾ããè¦ä»¶ããã¼ã«ã ãã§å®çµããã¢ããªã±ã¼ã·ã§ã³ã§ããã°ãRBACã§ä½ãæ¹ãã·ã³ãã«ã«ãªãã¨æãã¾ãããã ããä¸ã®ãããªã±ã¼ã¹ãåºã¦ããã¨ã ãããã®å ´åABACã«ãªã£ã¡ããã®ããªã¨æãã¾ãï¼
- åãã°ã«ã¼ãã ã£ããââã§ãã
- åéã ã£ããââã§ãã
- ââæ³ä»¥ä¸ãªãââã§ãã
- YYYYå¹´ãZZZZå¹´ã®éã«å å ¥ãã人ãªãââã§ãã
- ãªã©ãªã©
è¦ä»¶ãè¦æ¥µããªããæ¨©éã¢ãã«ã決ããå¿ è¦ãããã¾ãã
権éãé©ç¨ããå ´é¢
権éã¢ãã«ã«ã¤ãã¦è§¦ããã¨ããã§ã次ã¯ã©ãã§æ¨©éãé©ç¨ããã®ããã¨ããç¹ã«ã¤ãã¦èãã¾ããããã«ã¯æ¬¡ã®3ã¤ã®è¦³ç¹ãéè¦ãªã®ããªã¨æã£ã¦ãã¾ãã
- æ©è½çãªè¦³ç¹
- 対象ç¯å²ã®è¦³ç¹
- 対象é ç®ã®è¦³ç¹
ã¿ã¤ãã³ã°çã«ã¯APIã§ããã°ããªã¯ã¨ã¹ãå°çæããããã¼ã¿å徿ããããã¼ã¿è¿å´æãã«åé¡ã§ããã¨æã£ã¦ãã¾ããä¸å³ã®ããããã®ãã¤ã³ãã«ãªãã¾ãã
åèã¾ã§ã«ãClean Architectureçã«è¨ãã¨ä¸å³ã®ãã¤ã³ãã«è©²å½ãã¾ãã
ãããããããå°ã詳ããã¿ã¦ããã¾ãã
æ©è½çãªè¦³ç¹
æ©è½çãªè¦³ç¹ã¨ããã®ã¯ããããã対象ã¨ãªãæ©è½ã使ããã®ããã¨ããããªãåºãç¯å²ã®è¦³ç¹ã§ããAPIã§ããã°ããªã¯ã¨ã¹ããã¦ãã人ããä½è ããããã°ã夿ãä¸ããã¨ãã§ãã¾ãããä¸è¬ã¦ã¼ã¶ã¼ã ã£ãã管çè ç»é¢ãé²è¦§ã§ããªããã¨ãããããªã±ã¼ã¹ãããã«ãããã¾ãã
対象ç¯å²ã®è¦³ç¹
対象ç¯å²ã®è¦³ç¹ã¨ããã®ã¯ããé²è¦§ãã®ã¨ãã§ããã°ãã©ãã¾ã§è¦ã¦ããããã¨ããæå³ã§ã®ç¯å²ã§ããä¾ãã°å¤§ããªç é¢ã§å»è ã使ãã·ã¹ãã ããã£ã¦ããæ£è ä¸è¦§ããé²è¦§ããAPIããã£ãã¨ãã¾ãããã®ã¨ããæ£è ã¯ãã£ã¨ãããããã¾ãããå ¨ã¦ã®æ£è ã®æ å ±ãå ¨ã¦ã®å»è ãåçç¡ç¨ã«é²è¦§ã§ãã¦ãã¾ã£ã¦è¯ãã§ããããï¼çãã¯ãã£ã¨NOã§ããåç´ãªä¾ã ã¨ããã£ã¨å»è ãæ å½ãã¦ããæ£è ã®æ å ±ããé²è¦§ã§ããªããã¿ãããªå¶éãããã¯ãã§ããããã¯ä¸å³ã®ãããªã¤ã¡ã¼ã¸ã«ãªãã¾ãã
ãã®è¦³ç¹ã¯ä¸»ã«ãã¼ã¿ãåå¾ããéã«é©ç¨ãããã®ã§ãã
対象é ç®ã®è¦³ç¹
対象é ç®ã®è¦³ç¹ã¨ã¯ãä¾ãã°ãå人æ å ±ã®ã¯ã¬ã¸ããã«ã¼ãçªå·ã¯é表示ã«ãããã¨è¨ããããªãããã対象ã®å ·ä½çãªé ç®ãã«é¢ãã観ç¹ã§ãããã®è¦³ç¹ãã©ãã§é©ç¨ããã®ããã¨ããã®ã¯æªã ã«åãæ©ãã§ããã®ã§ãããAPIã§ããã°ãã¼ã¿ãè¿å´ããç´åï¼Presenter層ï¼ãªã®ããªã¨ä»ã®ã¨ããæã£ã¦ãã¾ãã
åè
3ã¤ã®è¦³ç¹ã«é¢ãã¦ãä¼¼ããããªãã¨ã以ä¸ã®Stack Overflowã§ãè¿°ã¹ããã¦ããã®ã§åããã¦èªãã§ã¿ãã¨ç¥èãåºããã¾ãã
権éã®ã½ããã¦ã§ã¢ã¢ã¼ããã¯ãã£
ä½ãèããã«ã¢ããªã±ã¼ã·ã§ã³ã®ä¸ã«æ¨©éãå®è£ ããã¨ããã¸ãã¹ã«ã¼ã«ã¨ãã¦å®è£ ãã¦ããã®ããæ¨©éã®é¢å¿äºã¨ãã¦å®è£ ãã¦ããã®ã訳ãããããªããªã£ã¦ãã¾ãã¾ããï¼èããªãããã£ã¦ãã¦ã訳ãåãããªããªã£ã¦ããã®ãåã®ç¾ç¶ï¼
権éã®ã¢ã¼ããã¯ãã£ãèããä¸ã§åèã«ãªã£ãã®ãXACMLï¼eXtensible Access Control Markup Languageï¼ã§ããXACMLã«é¢ãã¦ã¯åãã»ã¨ãã©ããã£ã¦ããªãã®ã§ããããæ¨©éå¶å¾¡ç¨ã®XMLã§æ¨æºåããã¦ããè¨èªä»æ§ããã¨ããèªèã§ããXACMLã®è©³ç´°ã«ã¤ãã¦ã¯èª¬æãããã¨ãã§ããªãã®ã§ãããXACMLã®ã¢ã¼ããã¯ãã£ã権éã«ãããå½¹å²ãçè§£ããããã«é常ã«ããããããã£ãã§ãã以ä¸ãAxiomaticsã®è¨äºããããããã説æãã¦ããã®ã¨ãåç»ãããã®ã§è±èªã«æµæãç¡ã人ã¯ãã²è¦ã¦ã¿ã¦ãã ããã
https://www.axiomatics.com/blog/xacml-reference-architecture/www.axiomatics.com
è¨äºå ã«ç»å ´ãã以ä¸ã®å³ãç¹ã«éè¦ã§ãã
å³ã«ããããã«ã権éã®ã¢ã¼ããã¯ãã£ã«ããã¦éè¦ãªå½¹å²ã4ã¤ããã¾ãã
- 権éã管çï¼Manageï¼ããå½¹å²
- PAPï¼Policy Administration Pointï¼
- 権éã®å¤æãä¸ããµãã¼ãï¼Supportï¼ãããå½¹å²
- PIPï¼Policy Information Pointï¼
- PRPï¼Policy Retrieval Pointï¼
- 権éãè¦ã¦å¤æãä¸ãï¼Decideï¼å½¹å²
- PDPï¼Policy Decision Pointï¼
- 権éãé©ç¨ï¼Enforceï¼ããå½¹å²
- PEPï¼Policy Enforcement Pointï¼
ãã®4ã¤ã®å½¹å²ãæèãããã¨ã§ã権éã®ã¢ã¼ããã¯ãã£ã¯çµæ§ããããããççµåã«çµã¿ç«ã¦ããã¨ãã§ãã¾ãã
åãçè§£ãã¦ããç¯å²ã§ããããã®å½¹å²ãããã¡ãã£ã¨è©³ããè¦ã¦ã¿ã¾ãã
権éã管çï¼Manageï¼ãã人
ããã¯èªãã§åã®å¦ããæ¨©éã管çããç®æã§ããä¸ã®å³ã«ããããã«PAPããPRPã«ã権éã«ã¾ã¤ããæ å ±ãä¿åããã¾ããAWSã§è¨ãã¨ããã®IAM Management ConsoleãPAPã¨è¨ãã¾ãã
権éã®å¤æãä¸ããµãã¼ãï¼Supportï¼ããã人
ããã¯æ¨©éã®å¤æã«å¿ è¦ãªä»å æ å ±ãåå¾ããç®æã ã¨åã¯æã£ã¦ãã¾ããPRPã¯æ¨©éã®æ å ±ãåå¾ã»ä¿æããç®æãªã®ã§ã権é夿ã§ä½¿ãæ å ±ã¨ãã¦ã¯ãµãã¼ãã¨ããããã¯æ ¸ã¨ãªãé¨åã ã¨æãã®ã§ãããPIPã§åå¾ããä»å æ å ±ãæ¨©éã®å¤æãä¸ããµãã¼ããããã¡ã¤ã³ã®ç®æã¨ããèªèã§ããç¾ã«ãPRPã表ç¾ããã«ãPIPã ãã表ç¾ããã¦ããå³ãããè¦ããã¾ããããã§è¨ãä»å æ å ±ã¨ã¯ãä¾ãã°APIã®ãªã¯ã¨ã¹ãã«ã¯JWTã ããéããã¦ãããã©ããã®JWTã«ç´ã¥ãã¦ã¼ã¶ã¼ã®å±æ§å¤ï¼å¹´é½¢ã»æå±ã°ã«ã¼ãï¼ãªã©ã®ãã¨ã§ãããããPIPãå¤é¨ãªã½ã¼ã¹ï¼APIã»DBã»LDAPãªã©ï¼ããåå¾ããæ¨©éã®å¤æã®ããã®ãµãã¼ããè¡ãã¨ããããã§ãã
権éãè¦ã¦å¤æãä¸ãï¼Decideï¼äºº
権éã®ä¸ã§ã¯ãããä¸çªä¸å¿ã¨ãªãé¨åã§ããããPAPã§ç®¡çãã¦ããæ¨©éãPRPã«ä¿æããã¦ãã¦ãPIPããã®ä»å æ å ±ã¨åããã¦æçµçãªå¤æãä¸ãã®ãããï¼PDPï¼ã§ãããããããã£ã¦ããã§ããï¼ãã®ãããªè³ªåãåãä»ããå ´æã§ãããããããããã¯ãã ããã¨ããåçãããå ´æã§ãã
夿ã®åçã¯åç´ã§ã¯ãªã
ä¸ã«ãããããã¨ãã ããã¨ãã£ãåç´ãªåçãä¾ã«ãã¾ããããå®éã®ã¨ãããã®ãããªåç´ãªåçã ãã§ã¯è¦ä»¶ãæºãããªããã¨ãå¤ãã¨æãã¾ããå ã®ä¾ã«ã使ã£ããå»è ã¯æ å½ãã¦ããæ£è ãé²è¦§ã§ãããã¨ããæ¨©éããã£ãã¨ãã¾ããPDPããããããããã¨ãã ããããåçã§ããªãã£ãå ´åããã®è¦ä»¶ãæºããããã«ã¯æ£è ã¬ã³ã¼ããå ¨é¨åå¾ãã¦ãä¸ã¤ãã¤ã«å¯¾ãã¦ãæ£è Xã®ãã¼ã¿ãé²è¦§ãã¦ããï¼ãã¨ãã質åãPDPã«ããªããã°ããã¾ããã10,000ã¬ã³ã¼ãããã°ã10,000å質åããå¿ è¦ãããã¨ãããã¨ã§ãã
ããã§ã¯ã¹ã±ã¼ã«ãã¾ããã
ã§ã¯ã©ãããã°ããã®ãï¼ããã¯ãã¯ãã¼ãºããªè³ªåã§ã¯ãªãããªã¼ãã³ãªè³ªåãã§ããããã«ããå¿ è¦ãããã¾ããã¯ãã¼ãºããªè³ªåããæ£è Xã®ãã¼ã¿ãé²è¦§ãã¦ããï¼ãã¨ããã®ã«å¯¾ãã¦ããªã¼ãã³ãªè³ªåã¯ãã©ã®æ£è ãé²è¦§ãã¦ããï¼ãã¨ãããã®ã§ããããã¦ããã®åçããæ å½ãã¦ããæ£è ã§ããã°ããããã¨ãããã®ã«ãªãã¾ããã¤ã¾ããåçã¯ãããããããã ããã¨è¨ã£ãåç´ãªãã®ã§ã¯ãªãããã£ã¨è¤éãªãã®ã«ãªãã¾ããå ·ä½çã«ã¯ãä¾ãã°ãã¼ã¿ã¹ãã¢ãRDBã ã£ãå ´åã«ãåçãSQLãã®ãã®ã§ããå¯è½æ§ããããã¾ãã
å®éã«ãã®ã½ãªã¥ã¼ã·ã§ã³ãæä¾ãã¦ããAxiomaticsã®ARQï¼Axiomatics Reverse Queryï¼ã以ä¸ã®åç»ã§ç´¹ä»ããã¦ãã¦ãé常ã«è峿·±ãã§ãã
ã¾ããä¸ã§ãç´¹ä»ãã¾ãããOpen Policy Agentã®ä»¥ä¸ã®è¨äºã«é¢ãã¦ãä¼¼ããããªãã¨ãå®ç¾ãããã¨ãã¦ãã¦è峿·±ãã§ãã
ãã®è¦³ç¹ã«é¢ãã¦ãè¨ã£ã¦ãããã¨ã¯ããã£ãã¨ãã¦ãããããå®éã©ãå®è£ ããã®ï¼ãã¨ããç¹ã«é¢ãã¦ã¯çµå±åãçããè¦ã¤ãã£ã¦ããããæ¨¡ç´¢ä¸ã§ããå°ãªãã¨ãAxiomaticsã®ãããªã½ãªã¥ã¼ã·ã§ã³ãèªåãã¡ã§ä½ãã®ã¯éç¾å®çã ã¨æãã¾ãï¼Axiomaticsã¯ãããå°éã«ãã¸ãã¹ã«ãã¦ããä¼ç¤¾ãªã®ã§ï¼ãã¾ãããããããåçãSQLã«ãããã¨ããã®ããæ¨©éã®å 容ã¨ãã¼ã¿ãã¼ã¹ã®é ç®ãå¯çµåããã¦ç¹ç´°ã«ãªããããã®ã§ã¯ãã¨ãæã£ã¦ãã¾ãã
権éãé©ç¨ï¼Enforceï¼ãã人
æå¾ã«éè¦ãªã®ããæ¨©éã®è³ªåããã¦åçãããã£ãå¾ã«æ¨©éãé©ç¨ããç®æã§ããããä¸å³ã§ããPEPã¨ãªãã¾ããAPIã§ããã°ããããããã¨ããåçããããããå¦çãç¶è¡ãããã ããã¨è¨ãããã403 Forbidden
ãè¿ããã¨ãã£ãå¦çããæ¨©éãé©ç¨ããã¦ãããã¨ã«ãªãã¾ãã
権éå®è£ ã®ã¢ããã¼ã
å®éã«æ¨©éã¯ã©ããã£ã¦å®è£ ããã¨è¯ãã®ããã¨ããã®ãã¾ãæ©ã¿ã®ç¨®ã§ããã対象ç¯å²ã®è¦³ç¹ãã§æ¨©éãé©ç¨ããã¨ããä¾ã«ã¨ã£ã¦ãå®è£ ã®ã¢ããã¼ãã«ã¤ãã¦æãã¦ã¿ã¾ãã
ãã¼ãã³ã¼ãããã¢ããã¼ã
権éå®è£ ã«ããã¦ãã¼ãã³ã¼ãã¨è¨ããã¦ä½ã®ãã¨ãªã®ãã¤ã¡ã¼ã¸ã§ããã§ããããï¼åã¯æåã¯å ¨ãã¤ã¡ã¼ã¸ã§ãã¦ããªãã£ãã§ããåã®ä¸ã§ã®å½åã®ãã¼ãã³ã¼ãã¨ããã®ã¯ä¸ã®ãããªã³ã¼ãã§ãã
// '100'ã£ã¦æ¸ãã¡ãã£ã¦ããã¨ããã¼ãã³ã¼ãã ã¨æã£ã¦ãã if (employee_id === '100') { execute(); }
ãã®ã¤ã¡ã¼ã¸ãä¸è¬çã«ã¯å¤ãããããªããã¨æãã¾ããããããæ¨©éå®è£ ã«ããããã¼ãã³ã¼ãã¨ããã®ã¯å°ãæ¯è²ãç°ãªãã¾ããç¾ç¶ã®åã®çè§£ã¯ä»¥ä¸ã®ã¨ããã¨ãªã£ã¦ãã¾ãã
権éå®è£ ã«ãããããã¼ãã³ã¼ããã¦ããç¶æ ãã¨ã¯ã権éã®å 容ãå¤ãã£ãå ´åã«ã権éã®é¢å¿ä»¥å¤ã®ã³ã¼ããå½±é¿ãåãã¦ãã¾ãç¶æ
ãµãã£ã¨ãã¦ã¦ãããã¥ããã¨æãã®ã§ãããå
·ä½ä¾ãããã¾ããå
ã«è¿°ã¹ãæ£è
ä¸è¦§ãåå¾ããAPIã«ã¤ãã¦èãã¦ã¿ã¾ãããæ£è
ä¸è¦§ãåå¾ãããAPIã§ããã°ãåç´ã«èãããã¨ã³ããã¤ã³ã㯠/api/patients
ã®ãããªãã®ã«ãªãã®ãæ³åã§ããã¨æãã¾ããããã¦ãã®ãªã½ã¼ã¹ãDBããåå¾ããå ´åã®ã³ã¼ãã¯ãã£ã¨ä¸ã®ããã«ãªãã¾ãï¼JSã£ã½ãæ¬ä¼¼ã³ã¼ãã§ãï¼ã
function findAllPatients() { return query.execute('SELECT * FROM patients'); }
ãã ããããã§ã¯æ¬å½ã«ãå ¨æ£è ãåå¾ããã¦ãã¾ãã¾ãããè¦ã¦è¯ãç¯å²ã®æ¨©éããé©ç¨ããã¦ãã¾ãããå ã®ä¾ã§ã¯ãæ å½ãã¦ããæ£è ã ãé²è¦§ãã¦è¯ããã¨ããè¦ä»¶ãããã®ã§ããã®æ¨©éãã³ã¼ãã«é©ç¨ããã¨ä¸ã®ããã«ãªãã¾ãã
// doctorIdã«ã¯ãªã¯ã¨ã¹ãããå»è ã®IDãå ¥ã function findAllPatients(doctorId) { return query.execute( 'SELECT * FROM patients p WHERE p.doctor_id = ?', doctorId); }
ãã® WHERE p.doctor_id = ?
ã¨æ¸ããå ´æã権éå®è£
ã«ãããããã¼ãã³ã¼ããã¦ããç®æãã«ãªãã¾ããä¸è¦ ?
ã«ã¯åçã«å»è
ã®IDãå
¥ãã®ã§ããã¼ãã³ã¼ããã¦ããããã«ã¯è¦ããªãã®ã§ãããæ¨©éã®å
容ãå¤ãã£ãå ´åã®ãã¨ãèãã¦ã¿ã¾ããããä¾ãã°ããæ
å½ãã¦ããæ£è
ã ãé²è¦§ãã¦è¯ããã¨ããæ¨©éãããåã診çç§å
ã®å»è
ãæ
å½ãã¦ããæ£è
ã ãé²è¦§ãã¦è¯ããã«å¤ãã£ãã¨ãã¾ãããããªãã¨ãä¸ã®ãããªã³ã¼ãã«å¤ããå¿
è¦ãããããã§ãã
// doctorIdã«ã¯ãªã¯ã¨ã¹ãããå»è ã®IDãå ¥ã function findAllPatients(doctorId) { // å»è ã®æå±è¨ºçç§ãç¥ãããã®ã§å»è ã®æ å ±ãåå¾ãã doctor = query.execute( 'SELECT * FROM doctors d WHERE d.id=?', doctorId); // å»è ã®æå±ãã診çç§å ã®å»è IDä¸è¦§ãåå¾ãã doctorIds = query.execute( 'SELECT id FROM doctors d WHERE d.department_id=?', doctor.departmentId); // æ£è ã®æ å½å»ãä¸ã§åå¾ããå»è IDã¨ä¸è´ãããã®ã ãåå¾ãã return query.execute( `SELECT * FROM patients p WHERE p.doctor_id IN (${doctorIds.join(',')})`); }
ãããæ¨©éãããã¼ãã³ã¼ãããã¦ãã¾ã£ã¦ãããããã«ãæ¬æ¥å½±é¿ãåãã¦ã»ãããªãfindAllPatients
ã®å®è£
ã«å¤æ´ãçºçãã¦ãã¾ã£ã¦ããç¶æ
ã§ããæ£è
ä¸è¦§ãåå¾ãã颿°ï¼findAllPatients
ï¼ã®ã¯ãããæ¨©éã®é¢å¿ãç´ãã¦ããããã§æ¨©éã®å
容ãå¤ãã£ãå ´åã«å½±é¿ãåãã¦ãã¾ããã¨ãããã®ã§ãã
ããããè¦ä»¶ãå¤ãã£ã¦ããã ããå½±é¿åãã¦ãããã§ããã
ã¨ãæãããããã¾ãããããããå»è ã«ãã£ã¦é²è¦§ã§ããç¯å²ãå¤ãã£ãããããã©ããªãã§ãããï¼ä¾ãã°ãä¸è¬æ¨©éã®å»è ã¯æ å½ãã¦ããæ£è ãé²è¦§ã§ããããããããã¼ã¸ã£ã¼æ¨©éããã¤å»è ã¯åã診çç§å ã®å»è ãæ å½ãã¦ããæ£è ãé²è¦§ã§ãããã¨ãã£ãéããããå ´åã§ããå¥ã ã®é¢æ°ãç¨æãã¦ãããã¼ã¸ã£ã¼ãªã®ãããããããªãã®ãã§ä½¿ãåãããããããªè¤éãªå®è£ ã«ãªãããã§ãã
function findAllPatients(doctor) { patients = []; if (doctor.role === 'MANAGER') { // ããã¼ã¸ã£ã¼ã ã£ãã patients = findMyDepartmentsPatients(doctor.id); } else { // ããã¼ã¸ã£ã¼ãããªãã£ãã patients = findMyPatients(doctor.id); } return patients; } // æ å½ãã¦ããæ£è ãåå¾ function findMyPatients(doctorId) { // ... } // åã診çç§å ã®å»è ãæ å½ãã¦ããæ£è ãåå¾ãã function findMyDepartmentsPatients(doctorId) { // ... }
ã¦ã¼ã¹ã±ã¼ã¹ã¨ãã¦ã¯ãæ£è
ä¸è¦§ã¿ãã表示ãããæ£è
ä¸è¦§ãåå¾ãããã¨ããã·ã³ãã«ããã«èããããã®ãªã¯ããªã®ã§ãããfindAllPatients
颿°ã®ä¸èº«ãè¦ããããªãã ãæã£ãããè¤éãªãã¨ããã¦ãããã¨ããç¶æ
ã«ãªã£ã¦ããã®ãæ³åã§ããã¨æãã¾ãã
ã³ã¢ãã¸ãã¯ããåãé¢ãã¢ããã¼ã
ã¨ãããã¨ã§ãã¼ãã³ã¼ãã®ã¢ããã¼ãã¯å°è¦æ¨¡ãä¸è¦æ¨¡ãªã¢ããªã±ã¼ã·ã§ã³ã¾ã§ãªãåé¡ç¡ãæ°ããã¾ãããä¸è¦æ¨¡ãå¤§è¦æ¨¡ãªã¢ããªã±ã¼ã·ã§ã³ã«ãªã£ã¦ããã¨ã³ã¼ãã®å¯èªæ§ãããã©ããªã£ã¦ãããã¨æãã¾ããããã§ã権éã®é¢å¿ã®åé¢ãããæ¹æ³ããã£ã¨ã¹ã±ã¼ã«ããã®ããªã¨æãã¾ãã
ãã®ã¢ããã¼ãã«ã¯ä¸ã®ä¾ã§ç¤ºãã¦ãããããªãçã®SQLãæ¸ããããæ¹ã¯å³ããããããªããã¨ç¾ç¶ã®åã¯æã£ã¦ãã¾ããSQL Query Builderã®ãããªãçã®SQLãWrapãããããªãã®ããã£ã¦ãSQLå®è¡åã«ä»å ¥ãã¤ã¤ã権éãé©ç¨ããä»çµã¿ãå¿ è¦ã ã¨æã£ã¦ãã¾ãã
åã¯èº«è¿ã§Laravelã使ã£ã¦ããã®ã§ãLaravelã®Query Builderã®åãåããã¨ä¸ã®ã³ã¼ãã®ããã«æ¨©éã¨ã³ã¢ãã¸ãã¯ã®åé¢ãã§ãããã§ããæ£è
ãåå¾ããORMï¼Eloquent Modelï¼ãPatient
ã¨ããã¨ï¼
<?php // ... // æ£è ä¸è¦§ãåå¾ $patients = App\Patient::enforcePolicy()->get();
enforcePolicy
ã¨ããã®ãLaravelã®Scopeã使ã£ã¦ãã¦ãã¢ãã«å
ã§ã¯ä¸ã®ããã«å®è£
ããã¦ãã¾ãï¼ãæ
å½ãã¦ããæ£è
ãã«çµãè¾¼ãã§ãã¾ãï¼ã権éã®å
容ã«å¤æ´ããã£ãå ´åã¯ãä¸ã®scopeEnforcePolicy
ã®ä¸èº«ãå¤ããã ãã§æ¸ã¿ãã³ã¢ãã¸ãã¯å´ã«ã¯å½±é¿ãç¡ãã¨ããç¶æ
ã«ãããã¨ãã§ãã¾ãã
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Patient extends Model { /** * @param \Illuminate\Database\Eloquent\Builder $query * @param String $doctorId * @return \Illuminate\Database\Eloquent\Builder */ public function scopeEnforcePolicy($query, $doctorId) { // æ å½ãã¦ããæ£è ã ãã«çµãè¾¼ã return $query->where('doctor_id', $doctorId); } }
ãã ããç¾æç¹ã§ãã§ã«èª²é¡ã¨æãã¦ããç¹ã¨ãã¦ã¯
App\Patient::enforcePolicy()->get()
ã§enforcePolicy()
ãå¼ã³åºãã¦ããæç¹ã§æç¤ºçã«ORMã使ãå´ã権éãæèããªãã¨ãããªãã®ã§ãçµæ§ç¹ç´°ãªã³ã¼ãã«ãªã£ã¦ãã¾ãï¼enforcePolicy
å¼ã³åºãå¿ãããå ¨åå¾ã§ãã¦ãã¾ãã»ãã¥ãªãã£ãªã¹ã¯ãããï¼- âã«ä¼¼ã¦ã¾ããã
Patient
ã¢ãã«ã«scopeEnforcePolicy
ã¨ããå®è£ ãå ¥ãã¦ããã®ã§ãPatient
ãæ¨©éãæèããå¿ è¦ããããããã«é è½åããããã¯å¦çãç§»è²ãã¦Patient
ãæèããªãããã«ããã¹ã
ã¨ãããã¨ã§ãããã¬ã¼ã ã¯ã¼ã¯ã¬ãã«ã§ããã«ããæãã«å®è£ ã§ãããã®ãããããã§ãããç¾ç¶ã§ã¯åã¯ããã¾ã§ææ¡ã§ãã¦ããããã¤ã¡ã¼ã¸çã«ãã®ãããªåé¢ãã§ãããç´ æµãªã®ã§ã¯ãã¨å¦æ³ãã¦ããã ãã§ãã
権éã¯ãã¸ãã¹ã«ã¼ã«ã®é¢å¿äºãªã®ã
ä¸ã§è²ã ã¨è¨ã£ã¦ãããªããããããè«ãªçåã«ãªã£ã¦ãã¾ãã®ã§ãããClean Architectureã ã£ããããã¡ã¤ã³é§åè¨è¨ã«ãææ¦ãã¦ããä¸ããæ¨©éã¯ãã¸ãã¹ã«ã¼ã«ã®é¢å¿äºãªã®ããã¨ããçåã¸ã®ã¹ãããªããçããæªã ã«è¦ã¤ãã£ã¦ãã¾ãããå°ãªãã¨ãä¸ã«è¿°ã¹ã¦ããå®è£ ã®ã¢ããã¼ãã¯ããã¸ãã¹ã«ã¼ã«ã¨æ¨©éã®é¢å¿ãåé¢ãã¦ããã¢ããã¼ãã®ã¤ããã§ãããªã®ã§ã権éã®å¤æ´ã«ãã£ã¦ãã¸ãã¹ã«ã¼ã«å´ï¼ãã¡ã¤ã³ï¼ã«ã¯å½±é¿ãç¡ãããã«ãã¦ãã¾ãã
Clean Architectureã®ããããããããClean Code Discussionã«ããã¦ä»¥ä¸ã®ããã«çºè¨ãã¦ãã¾ãã
Security is an application specific concern, it belongs to the interactors. The controllers would access the current user's credentials and pass that information to the interactors. The interactors would use an authorization service to ensure that their particular interaction was authorized. The business objects wouldn't know anything about it.
ãã»ãã¥ãªãã£ã¯ã¢ããªã±ã¼ã·ã§ã³ç¹æã®é¢å¿äºã§ããããã¸ãã¹ãªãã¸ã§ã¯ãã¯ãã®ãã¨ã«ã¤ãã¦æèããªããã¨è¨ã£ã¦ãã¾ãããªã®ã§ãã®è¨èããã®ã¾ã¾éµåã¿ã«ããã¨ããæ¨©éã®é¢å¿ããã¸ãã¹ã«ã¼ã«å ã«æã£ã¦ããªããèãæ¹ã¯ééã£ã¦ããªãã®ããªã¨æã£ã¦ãã¾ãï¼ã»ãã¥ãªãã£ã«é¢é£ããã¢ããªã±ã¼ã·ã§ã³ãä½ã£ã¦ããã®ã§ããã°è©±ã¯ãã£ã¨éãï¼ã
ãã®è¦³ç¹ã«é¢ãã¦ã¯è²ã ãªäººã®è²ã ãªã¢ããªã±ã¼ã·ã§ã³ã§ã®è²ã ãªå®è£ æ¹æ³ãèãããã§ãã
ã·ã¹ãã ã¢ã¼ããã¯ãã£
ã©ãã¾ã§æ¨©éã®é¢å¿ãåé¢ããã®ããã¨èããã¨ãã«æèããªãã¨ãããªãã®ãã·ã¹ãã ã¢ã¼ããã¯ãã£ã§ããã¢ããªã·ãã¯ã¨ãã¤ã¯ããµã¼ãã¹ãªã¢ããã¼ãã«ã¤ãã¦è¨åããããããã®ã¡ãªããã»ãã¡ãªããã«ã¤ãã¦è¿°ã¹ããã¨æãã¾ãã
ã¢ããªã·ãã¯ãªã¢ã¼ããã¯ãã£
è¿·ã£ãå ´åã«ã¾ãã¨ã£ã¦ã¿ãã¢ããã¼ããã¢ããªã·ãã¯ãªã¢ã¼ããã¯ãã£ãã¨æãã¾ããä¸å³ã®ããã«ãä¸ã«åºã¦ããPEP, PDP, PIP, PAPããã¹ã¦åãã¢ããªã±ã¼ã·ã§ã³ã«è©°ãè¾¼ããã¨ã«ãªãã¾ãã
ããããã®âãå¥ã ã®ã¢ããªã±ã¼ã·ã§ã³ãµã¼ãã¹ã«ãªã£ã¦ããã®ãããããããåãæ¹ããªã¨æã£ã¦ãã¾ãã
èããããã¡ãªãã
- ä¸ã¤ã«ã¾ã¨ã¾ã£ã¦ããã®ã§ç®¡çãããããï¼ã¯ãï¼
- ä¸ã¤ã®ã³ã¼ããã¼ã¹ãªã®ã§ã³ã¼ãã追ãããã
- CI/CDãªã©éçºããã»ã¹ãã·ã³ãã«
èãããããã¡ãªãã
- ããã°ã©ãã³ã°è¨èªã®ç¸ããçºçããè¨èªã«ä¾åããã©ã¤ãã©ãªãã使ããªããã¨ã«ãªã
- 権éã«å¤æ´ãçºçããã°åºæ¬çã«ã¢ããªã±ã¼ã·ã§ã³ããããã¤ãç´ãå¿ è¦ããã
- ä»ã®ã¢ããªã±ã¼ã·ã§ã³ãåãæ¨©éåºç¤ã使ãããå ´åã«ãä¸å¿ è¦ãªã¢ããªã±ã¼ã·ã§ã³éã®ä¾åãã§ãã¦ãã¾ã
åè
権éã®å®è£ ãããã«ããã£ã¦ã¹ã¯ã©ããããå ¨é¨ä½ãã®ã¯å¤§å¤ãªã®ã§ãCasbinã®ãããªã©ã¤ãã©ãªã®åãåããªããå®è£ ãã¦ãããã®ããªã¨æã£ã¦ãã¾ãã
ãã¤ã¯ããµã¼ãã¹ãªã¢ã¼ããã¯ãã£
éç¨ä¸ã®æ¸å¿µç¹ãå¢ãã䏿¹ã§ãæã権éã®é¢å¿ã®åé¢ãè¡ããã®ããã®ãã¤ã¯ããµã¼ãã¹çã¢ããã¼ãã«ãªããã¨æãã¾ããPEP以å¤ï¼PDP, PIP, PAPï¼ã®æ¨©éã«é¢é£ããç»å ´äººç©ã¯ãã¹ã¦å¥ã¢ããªã±ã¼ã·ã§ã³ã«ãã¾ãã
èããããã¡ãªãã
- 権éã¢ããªã±ã¼ã·ã§ã³ã«æé©ãªè¨èªã»ã©ã¤ãã©ãªã鏿ã§ãã
- 権éã¢ããªã±ã¼ã·ã§ã³ã¨ãã®ä»ã¢ããªã±ã¼ã·ã§ã³ã®ãããã¤ã¹ãã©ãã¸ãåé¢ã§ãã
- 権éã¢ããªã±ã¼ã·ã§ã³åä½ã§ã¹ã±ã¼ã«ã§ãã
èãããããã¡ãªãã
- å
¨ä½çã«ç®¡çãè¤éã«ãªã
- ã³ã¼ããã¼ã¹ã®åé¢
- ã½ããã¦ã§ã¢ã¢ã¼ããã¯ãã£ãè¤éã«ãªããã¡
- å¥ã¢ããªã±ã¼ã·ã§ã³ã§ãããããã®æ¸å¿µäºé ã®å¢å ï¼ç¹ã«ãããã¯ã¼ã¯å¨ãï¼
åè
Open Policy Agent
CNCFã®ããã¸ã§ã¯ãã§ãããOpen Policy Agentãããªãè峿·±ãåå¨ã§ããOpen Policy Agentã«ã¯ãµã¼ãã¼ã¢ã¼ããããã®ã§ãOut of the boxã§ãã®ã¾ã¾å¥ã¢ããªã±ã¼ã·ã§ã³ã¨ãã¦ä½¿ããã¨ãã§ãã¾ãããã®ã¾ã¾ã®æ©è½ã§ã¯ä¸ååã ã¨æããããGoã®ã©ã¤ãã©ãªã¨ãã¦ã使ããã¨ãã§ããã®ã§ãå¼·åãªæ¨©éã¢ããªã±ã¼ã·ã§ã³ãGoã§èªä½ãããã¨ãå¯è½ã§ãã
ã¾ããæ¨©éç¨ã®ç¬èªã®è¨èªRegoãæ±ã£ã¦ãã¦ã権éã宣è¨çã«å®ç¾©ãããã¨ãã§ãã¾ããOpen Policy AgentãRegoã«é¢ãã¦ã¯ãã®ããã°ã§ãä½åº¦ãç´¹ä»ãã¦ããã®ã§ãæ°ã«ãªãæ¹ã¯ãã²èªãã§ã¿ã¦ãã ããã
Authzforce
åã¯ä½¿ã£ããã¨ããªãã®ã§ããXACMLã«æºæ ãã¦ãã¦OSSãªãã®ã§åãéã£ã¦ãããã®ã¨ãã¦Authzforceã¨ãããã®ãããããã§ããCommunity Editionãããã¿ãããªã®ã§ãè©ä¾¡ãã¦ã¿ã価å¤ãããã¨æãã¾ãã
authzforce-ce-fiware.readthedocs.io
Axiomatics
æåã«ã¯ãªãã¾ãããAxiomaticsã®ã½ãªã¥ã¼ã·ã§ã³ã使ãã¨ãã鏿è¢ãããããã§ããXACMLã®ã©ããã¼è¨èªã¨ãã¦ALFAã使ããã¨ãã§ãã宣è¨çã«æ¨©éãå®ç¾©ãããã¨ãã§ãã¾ããKubernetesä¸ã«ããããã¤ã§ããããã§ãPayPalã使ã£ã¦ããããã§ãã
ä½è«ã§ãããæ¨©éå¨ãã®StackOverflowã®è³ªåã«å¯¾ãã¦ããã®ãããããããããã¦è¯ãåçããã¦ãã人ãããã¨æã£ãå ´åã«ã¦ã¼ã¶ã¼ãè¦ã¦ã¿ãã¨ãã ãããAxiomaticsã®David Brossardæ°ã§ããæ¨©éã®ç¥èãå¢ãããããã°ãã©ãã¼ãã¦ããã¨ãããåå¼·ã«ãªãã¾ãã
ã¢ãã³ãªããã³ãã¨ã³ãã«ãããæ¸å¿µäºé
å¿ããã¡ãªã®ãããã³ãã¨ã³ãã®è¦³ç¹ã§ããSPAï¼Single Page Applicationï¼ç»å ´åã§ããã°ããã³ãã®çæï¼HTMLï¼ããµã¼ãã¼ãµã¤ããæ å½ãã¦ããã®ã§ããµã¼ãã¼ãµã¤ããæã£ã¦ããæ¨©éã®æ å ±ãããã³ãå´ã«ã使ãã°è¯ãã¨ãããã®ã§ããã
Laravelã®PolicyãBladeãã³ãã¬ã¼ãã§ä½¿ãä¾ããã®ããããã«å½ããã¾ããä»ã®ãã¬ã¼ã ã¯ã¼ã¯ã§ãä¼¼ããããªãã¨ãã§ããã¯ãã§ãã
@can('update', $post) <!-- The Current User Can Update The Post --> @elsecan('create', App\Post::class) <!-- The Current User Can Create New Post --> @endcan @cannot('update', $post) <!-- The Current User Can't Update The Post --> @elsecannot('create', App\Post::class) <!-- The Current User Can't Create New Post --> @endcannot
ããããæè¿ã¯React, Vue.js, Angularãªã©ã®SPAã使ããã¨ãå¢ãã¦ãããããããã³ãã¨ãµã¼ãã¼ãµã¤ããåé¢ãã¦ãã¾ããã¨ãããã¨ã¯ãæ¨©éæ å ±ã¯æ¨æºã§ããã³ãå´ã¯æã£ã¦ããªãã¨ãããã¨ãæèãã¦ããå¿ è¦ãããã¾ããããæ¹ã¨ãã¦ã¯å¤§ããã¯2ã¤ããã®ããªã¨æã£ã¦ãã¾ããä¸å³ã®ãããªãç·¨éæ©è½ä»ãæ£è ä¸è¦§ç»é¢ããä¾ã«ã¨ã£ã¦ãã©ãããã¢ããã¼ãããããè¦ã¦ã¿ã¾ãã
ãªã½ã¼ã¹èªä½ã«æ¨©éã®å 容ãåãè¾¼ãæ¹æ³
ãã®æ¹æ³ãä¸è¬çã«ã¯å¤ãå°è±¡ãããã¾ããAPIã®ã¬ã¹ãã³ã¹ã以ä¸ã®ãããªå½¢ã«ãªãã¾ãã
[ { "id": "1", "name": "æ£è A", "doctorName": "å»è A", "editable": true }, { "id": "2", "name": "æ£è B", "doctorName": "å»è B", "editable": false }, { "id": "3", "name": "æ£è C", "doctorName": "å»è A", "editable": true } ]
ããã«ç»å ´ããeditable
ã®ãã¼ããæ¨©éæ
å ±ããªã½ã¼ã¹ã«åãè¾¼ã¾ãã¦ãç¶æ
ãã¨åã¯å¼ãã§ãã¾ãããæ£è
ãã®ãªã½ã¼ã¹ãåå¾ã§ããAPIã®ã¯ãããæ£è
ã¨ã¯é¢ä¿ãªããç·¨éå¯è½ãã©ããï¼editable
ï¼ãã¨ããæ¨©éã®æ
å ±ãã¾ããããã§ããã®ããããã¾ãã
èããããã¡ãªãã
- ããã³ãã¯å§åçã«å®è£
ããããï¼ä¸ã®ä¾ã§ããã°
editable
ãè¦ãã ãã§ç·¨éãã¦è¯ããã©ããã夿ã§ããï¼
èãããããã¡ãªãã
- ãªã½ã¼ã¹ã«æ¨©éã®æ å ±ãç´ãè¾¼ãã§ãã¾ã
- âã®å½±é¿ã§ãµã¼ãã¼ãµã¤ãã®ãæ£è ä¸è¦§åå¾ãAPIã¯ãæ£è ã®æ å ±ä»¥å¤ã«æ¨©éã®æ å ±ãJSONã«ä»å ããå¿ è¦ããã
æ¨©éæ å ±ããªã½ã¼ã¹ã¨åãé¢ãæ¹æ³
ãã®æ¹æ³ã¯é¦´æã¿ããã¾ãç¡ãã¨ãã人ãå¤ãã®ã§ã¯ãªããã¨æãã¾ãããã®ã¢ããã¼ãã®å ´åãAPIããåå¾ãããªã½ã¼ã¹ã®æ å ±ã«ååã¨ãã¦ãæ¨©éæ å ±ããå«ãã¾ãããæ¨©éæ å ±ã¯å¥APIãç¨æãããã¨ã«ãªãã¾ãã
ã¾ããæ£è ä¸è¦§ãåå¾ããAPIã®JSONã¯ä¸ã®ããã«ãªãã¾ãã
[ { "id": "1", "name": "æ£è A", "doctorName": "å»è A" }, { "id": "2", "name": "æ£è B", "doctorName": "å»è B" }, { "id": "3", "name": "æ£è C", "doctorName": "å»è A" } ]
åã®ä¾ã¨ã®éãã¯ã権éæ
å ±ã§ããeditable
ãæ¶ãããã¨ã§ããã§ã¯ç·¨éå¯è½ãªæ£è
ã¯ã©ã®ããã«è¦åããã®ã§ãããï¼ãã®ããã«å¥é権éæ
å ±ãåå¾ããAPIãç¨æãã¾ããæ¨©éã®APIã«å¯¾ãã¦ã¯ãç§ã¯ä½ãã§ãã¾ããï¼ãã¨ããåãåãããããã¤ã¡ã¼ã¸ã§ãã以ä¸ã¯æ¨©éAPIã®ã¬ã¹ãã³ã¹JSONã®ä¸ä¾ã§ãã
[ { "action": "read", "resource": "patient" }, { "action": "edit", "resource": "patient", "condition": { "doctorName": "å»è A" } } ]
èªã¿æ¿ããã¨ãããã¹ã¦ã®patient
ãªã½ã¼ã¹ã®é²è¦§ãã§ããããã¨ã¨ãdoctorName
ãå»è
A
ã¨ãªã£ã¦ããpatient
ãªã½ã¼ã¹ãªãç·¨éã§ããããã¨ããå
容ã«ãªãã¾ãã
ä¸å³ã®ããã«ã2ã¤ã®APIããåå¾ããæ å ±ãçµã¿åããããã¨ã§UIãä½ããã¨ã«ãªãã¾ãã
èããããã¡ãªãã
- APIè¨è¨æã«ããªã½ã¼ã¹ã«å¯¾ããæ¨©éã®é¢å¿ãåºæ¬çã«ã¯èããªãã¦è¯ããªã
- é¢å¿ã®åé¢ã®ãããã§ã³ã¼ãã®ä¿å®æ§ãé«ã¾ãï¼ã¯ãï¼
èãããããã¡ãªãã
- è¯ããæªãããæ¨©éã®é¢å¿ãåé¢ãã¦ãããã¨ã«ããè¨è¨ã®ã³ã¹ãã ã£ããå¦ç¿ã³ã¹ãã¯ããªãé«ããªã
- ããã³ãã®å®è£ ã³ã¹ããé«ããªãï¼æ¨©éAPIã¨ã対象ã¨ãªããªã½ã¼ã¹ãçµã¿åããã¦UIã®æåãèããå¿ è¦ãããï¼
åè
権éã®åé¢ãè¡ã£ã¦ããã¢ã¼ããã¯ãã£ãæ¯æ´ãã¦ãããã©ã¤ãã©ãªã ã£ãããããã¥ã¡ã³ããããã¤ãããã®ã§ç´¹ä»ãã¾ãã
CASL
CASLã¨ããã©ã¤ãã©ãªã主è¦ãªJSãã¬ã¼ã ã¯ã¼ã¯ã¨é£æºãã¦ä½¿ããã¨ãã§ãã¾ãã
ä½ã«å¯¾ãã¦ãã©ããªã¢ã¯ã·ã§ã³ããã©ããªæã«å®æ½ãã¦è¯ããã¨ããæ¨©éã®é¢å¿ãç¬ç«ãã¦ç®¡çãããã¨ãã§ãã¾ããåèã¾ã§ã以ä¸ãå®éã®JSONã§ã®å®ç¾©ä¾ã§ãã
[ { "actions": ["create", "read", "update", "delete"], "subject": "Post", "conditions": { "author": "1" } }, { "actions": ["read", "update"], "subject": "User", "conditions": { "id": "1" } } ]
ï¼ã¤ç®ã®å®ç¾©ã¯ãPostã®author
ã®å¤ã"1"
ã§ããã°ãcreate
, read
, update
, delete
ã®ã¢ã¯ã·ã§ã³ã許å¯ãããã¨ãããã®ã§ãï¼ã¤ç®ã®å®ç¾©ã¯ãUserã®id
ã"1"
ã§ããã°ãread
, update
ã®ã¢ã¯ã·ã§ã³ã許å¯ãããã¨ãããã®ã§ãããã®æ
å ±ãUIå´ãã使ã£ã¦ãä¾ãã°ãç·¨éãã¿ã³ã表示ã»é表示ãã«ãããã¨ãã§ãã¾ãã
Chef Automate
ãã®ãããã¯ã«ã¤ãã¦èª¬æãã¦ããããã¥ã¡ã³ãã¨ãã¦Chef Automateã®Authorizationã³ã³ãã¼ãã³ããããã¾ããç¹ã«Introspectionã®ç¯ãããã«ãããã¾ããæ¨©éè¨è¨å«ãã¦ç¥ããã£ã¦ããããã¥ã¡ã³ãã ã¨æãã®ã§ããã²ä¸åº¦èªãã§ã¿ããã¨ããããããã¾ãã
権éè¨è¨ã¯ã©ããç®æãããè¯ãã®ã
ãããã¹ããªæ¨©éè¨è¨ãï¼ãã¨è¨ããã¦ããæ¨©éå®è£ ãã¹ããã©ã¯ãã£ã¹ãã¨ã°ã°ã£ãã¨ããã§ã権éãã®ã«ãã¼ãã¦ããé åãåºããã¦æ±ãã¦ããæ å ±ããªããªãè¦ã¤ããã¾ããããã®ä¸ã§åãä»ã®æç®æãã¦ããæ¹åæ§ã¨ãã¦ã¯ãAWSã®IAMã®ãããªä»çµã¿ãã§ãã
çç±ã¨ãã¦ã¯ï¼
- ä¸ã«ãä½åº¦ãè¨åãã¦ããOpen Policy Agentã®Slackã§åº¦ã ãAWSã®IAMã®ãããªä»çµã¿ãä½ããããã£ã¦äººãç»å ´ãã
- Open Policy Agentã使ã£ã¦ããChef Automateãæ¹åæ§ãä¼¼ã¦ããï¼ãã ãConditionã¨ããæ¦å¿µã¯ã¾ã ç¡ãï¼
- Open Policy Agentã使ã£ã¦ããory/ketoã®ä»çµã¿ãAWSã®IAMã«ä¼¼ã¦ããï¼Conditionã®æ¦å¿µãããï¼
- IAM Policyã®å ±éã®JSONãã©ã¼ããããããããããããå 人ã®ç¥æµãã¤ã¾ã£ã¦ãã
- AWSã®IAMã«é¢ããããã¥ã¡ã³ããæ¨©éè¨è¨ã«ããã¦ãããåå¼·ã«ãªã
ã¨ããããã«ã権éè¨è¨ã»å®è£ ãããããã®ã¨ã£ãããããã£ããã¨ããæãã§ãããã ãåèªèº«ãOpen Policy Agentã«ã¯ãã¨ãã¨æå¾ ãã¦ããã¨ãããã¤ã¢ã¹ãåãã¦ãã®ãçç±ã¨ãã¦ã¯å¤§ããã¨æãã¾ãã
å®å ¨ã«ãAWSã®IAMããä½ãã¨ãããç®æãã®ã¯éç¾å®çã§ãããç¾å®çãªã©ã¤ã³ãè¦æ¥µããªããã·ã³ãã«ã§è¯ãã¨ãããèªåã®ã·ã¹ãã ã«çµã¿è¾¼ãã§ããã¢ããã¼ããè¯ãããããªããã¨æã£ã¦ãã¾ãã
æ¬å½ã«å¼·åãªæ¨©éãµã¼ãã¹ãå¿ è¦ã§ããã°ãAxiomaticsã®ãããªæåãµã¼ãã¹ã«ç§»è²ãããã¨ãæç¨ãªé¸æè¢ã®ä¸ã¤ã ã¨æãã¾ããããã«é¢ãã¦ã¯ã³ã¹ãã¨ã¦ã¼ã¹ã±ã¼ã¹ã®ãã£ãããèªåãªãã«è¦æ¥µãããããªãã§ãããã
æå¾ã«
ããã¾ã§èªãã§ããã ããããã¨ããããã¾ããããã¦ãã¾ã¨ã¾ãã®æªãå 容ã«ãªã£ã¦ãããã¨ãå度ãè©«ã³ãããã¾ãããã ãåããæ¨©éè¨è¨ã«æ©ã誰ãã®ãã³ãã«ãªã£ãããåãããã«æ©ãã§ãã人ããããã ãã¨ããå ±æãæã¦ãå 容ã«ã©ãããããªã£ã¦ããã幸ãã§ãã
ä»å¾ããã®è¨äºãã¢ãããã¼ããã¦ããã¤ããã§ãããç¬ãã§è¦æ©ãã¦ãã¦ãã¤ããã®ã§ã権éè¨è¨Meetupã¨ããã£ããé¢ç½ãããããªãããªãã¨æãã¾ãããè²ã ãªäººã®æ³¥èã話ãèããæ°ããããªãã§ããã¾ãããArchitecting Authorizationãã¿ãããªæ¬ãåºã¦ã»ãããªã¨ããæ°æã¡ãããã¾ããæ¬å½ã«ãããä¸ã®ä¸ã®ã¨ã³ã¸ãã¢ã¯ã©ããã£ã¦ãã®è¦æ©ã¨éã£ã¦ããã®ã§ãããï¼
ä»ã®åã¯ã¨ããã¨ãOpen Policy Agentã®Slackãè¦ãªãããåãããã«è¦æ©ãã¦ãã人ã®ä¼è©±ãæ¥ã 追ã£ã¦ãã¾ããèå³ããã人ã¯ãã²Joinãã¦ã¿ã¦ãã ããã
é·ã ã¨æ¸ãã¦ãã¾ãã¾ãããããã£ããããã¾ã§ã¨ãã¦å¼ãç¶ãç²¾é²ãç¶ãããã¨æãã¾ãã
ãã®ä»åèæ å ±
AWS IAMã®ãããªã·ã¼ã®è©ä¾¡è«çãã«é¢ããããã¥ã¡ã³ã
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_evaluation-logic.html
AWS IAMã«é¢ããä¸å¯§ãªè§£èª¬ã¨ãæå¾ã«ã¯ABACã®ä¾ãç´¹ä»ããã¦ããåç»
AxiomaticsãRBACããABACã¸ã®ãã©ãã¤ã ã·ããã«ã¤ãã¦è©³ããè¿°ã¹ã¦ããè¨äº
https://www.axiomatics.com/blog/the-state-of-the-union-of-authorization/www.axiomatics.com
IAMã«é¢ããæ¦è¦èª¬æãAxiomaticsã®Davidãåçãã¦ããStack Exchange
ABACã®å®è£ ã«ã¤ãã¦Axiomaticsã®Davidã説æãã¦ããè¨äº
AxiomaticsãDynamic Filteringã¨Dynamic Maskingã«ã¤ãã¦è¿°ã¹ããã¦ããè¨äº
AxiomaticsãDynamic AuthorizationãDemoã¨ã¨ãã«ä¸å¯§ã«è§£èª¬ãã¦ããåç»