C#ã¯ããšã³ã¿ãŒãã©ã€ãºãœãããŠã§ã¢ãã¯ã©ãŠãã¢ããªã±ãŒã·ã§ã³ããã¹ã¯ãããã·ã¹ãã ãã²ãŒã éçºãªã©ãå¹ åºãåéã§äœ¿çšãããŠãã匷åã§æ±çšæ§ã®é«ãããã°ã©ãã³ã°èšèªã§ãã.NETãšã³ã·ã¹ãã ã®äžæ žã³ã³ããŒãã³ãã§ããC#ã¯ãéçºè ãå ç¢ã§ã¹ã±ãŒã©ãã«ãªãœãªã¥ãŒã·ã§ã³ãæ§ç¯ã§ããããæ¯æŽãããæçãããã¬ãŒã ã¯ãŒã¯ãšããŒã«çŸ€ã®æ©æµãåããŠããŸãã
ã³ãŒãããŒã¹ã®ãµã€ãºãšè€éããå¢ãã«ã€ãã ã³ãŒãå質ã®ç¶æããã©ãŒãã³ã¹ãšã»ãã¥ãªãã£ã®äž¡ç«ã¯æ·±å»ãªèª²é¡ãšãªããŸããå°ããªãã°ã倧ããªåé¡ã«çºå±ããæé©åãããŠããªãã³ãŒãã¯å¹çãäœäžãããã»ãã¥ãªãã£äžã®æ¬ é¥ã«æ°ã¥ãããã«ã·ã¹ãã ãçã®è åšã«ãããããå¯èœæ§ããããŸãã éçã³ãŒãè§£æããŒã« ããããæžå¿µãæ¬çªç°å¢ã§è¡šé¢åããåã«ãå®çšçãã€ç©æ¥µçã«å¯ŸåŠããæ¹æ³ãæäŸããŸãã
éçè§£æ ãœãŒã¹ã³ãŒããå®è¡ããã«æ€æ»ããŸããæ§æãšã©ãŒãæ€åºãã ã³ãŒãã®èããããã©ãŒãã³ã¹ã®ããã«ããã¯ãä¿å®æ§ã®ãªã¹ã¯ããã㊠ã»ãã¥ãªãã£äžã®è匱æ§ããããããã®ããŒã«ã¯ãéçºè ãããŒã ãã³ãŒãã£ã³ã°æšæºãæœè¡ããæè¡çè² åµã远跡ãããœãããŠã§ã¢ã®é·æçãªä¿å®æ§ã確ä¿ããã®ã«åœ¹ç«ã¡ãŸãã
C#ãšã³ã·ã¹ãã ã¯ãå¹ åºãéçè§£æãœãªã¥ãŒã·ã§ã³ãæäŸããŠããŸããVisual Studioã«çŽæ¥çµ±åãããéçºäžã®ãªã¢ã«ã¿ã€ã ãã£ãŒãããã¯ããµããŒããããã®ãããã°ãããæ·±ãåææ å ±ãæäŸãããã«ããã€ãã©ã€ã³ãšçµ±åããŠç¶ç¶çãªå質ç£èŠãå®çŸãããã®ããããŸããåããŒã«ã¯ãããžãã¯ãšã©ãŒã®æ©æçºèŠãå¯èªæ§ã®åäžãã»ãã¥ãªãã£ããªã·ãŒãžã®ã³ã³ãã©ã€ã¢ã³ã¹ç¢ºä¿ãªã©ãããããç°ãªãç®çãæãããŸãã
C#éçºã§å©çšå¯èœãªäž»èŠãªéçè§£æããŒã«ãã玹ä»ããŸããããããã®æ©èœãæ¯èŒãã匷ã¿ãæµ®ã圫ãã«ããçŸä»£ã®éçºã¯ãŒã¯ãããŒã«ãããæé©ãªããŒã«ã®æŽ»ç𿹿³ã解説ããŸããã³ãŒãå質ã®åäžããã°ã®åæžãã»ãã¥ãªãã£ã®åŒ·åãã³ãŒãã¬ãã¥ãŒã®åæ»åãªã©ãç®æšãäœã§ãããé©åãªè§£æããŒã«ã䜿çšããããšã§ãããè¿ éãã€ç¢ºå®ã«ç®æšãéæã§ããŸãã
SMART TS XL
SMART TS XL ãšã³ã¿ãŒãã©ã€ãºã°ã¬ãŒãã®ã¢ããªã±ãŒã·ã§ã³åãã«ã«ã¹ã¿ãã€ãºãããå æ¬çãªéçã³ãŒãè§£æãœãªã¥ãŒã·ã§ã³ãšããŠéç«ã£ãŠãããC#ã®ãµããŒãã«ãããçŸä»£ã®.NETãšã³ã·ã¹ãã ã«ããã匷åãªç«¶å補åãšãªã£ãŠããŸããå€§èŠæš¡ã§è€éãªãœãããŠã§ã¢ã·ã¹ãã ã«ã察å¿ã§ããããèšèšãããŠããã SMART TS XL ã³ãŒãæ§é ããããŒãçžäºäŸåæ§ã詳现ã«å¯èŠåããéçºè ãšããŒã ãã³ãŒãããŒã¹å šäœã®ä¿å®æ§ãã³ã³ãã©ã€ã¢ã³ã¹ããªã¹ã¯ç®¡çãæ¹åã§ããããã«ããŸãã
ã©ã®ãããªã»ãã SMART TS XL ä»ãšäžç·ãç»ãã®ã¯ãé«ã¬ãã«ã®ã¢ãŒããã¯ãã£æŽå¯ãšã³ãŒãã¬ãã«ã®ãã现ããªèšºæã®äž¡æ¹ãæäŸããããšã«éç¹ã眮ããŠããç¹ã§ããç¹ã«ã次ã®ãããªç°å¢ã§å¹æãçºæ®ããŸãã ã¬ã¬ã·ãŒã·ã¹ãã ææ°ã® C# ã³ãŒããå ±åããèšèªéã®åæãšãã€ããªãã ã³ãŒãããŒã¹ã®ãµããŒããæäŸããŸãã SMART TS XL ç£æ»èšŒè·¡ãã«ãŒã«ã®é©çšã远跡å¯èœæ§ãéèŠãšãªããèŠå¶ã®å³ããæ¥çã§åºã䜿çšãããŠããŸãã
ã®ã¡ãªãã SMART TS XL C# éçè§£æçš
- ã¯ã©ã¹ãã¢ã»ã³ããªããµãŒãã¹å šäœã®åŒã³åºããããŒãšããžãã¯ãã¹ãèŠèŠåããŸã
- å€§èŠæš¡ãª C# ã¢ããªã±ãŒã·ã§ã³å ã®é ããäŸåé¢ä¿ãšãããã³ãŒããèå¥ããŸã
- ã³ãŒãã£ã³ã°æšæºãšã¢ãŒããã¯ãã£ããªã·ãŒãé©çšããããã®ã«ã¹ã¿ãã€ãºå¯èœãªã«ãŒã«ã»ããããµããŒã
- CI/CD ãã€ãã©ã€ã³ãšçµ±åããŠå質ãã§ãã¯ãšã³ãŒãæ€èšŒãèªååããŸã
- ãªãã¡ã¯ã¿ãªã³ã°ãšã¢ããã€ãŒãŒã·ã§ã³ã®åãçµã¿ããµããŒããã匷åãªåœ±é¿åæãæäŸããŸã
- æ°åã®ãã¡ã€ã«ãšè€æ°ã®ã³ãŒããªããžããªã«ããã£ãŠå¹æçã«æ¡åŒµå¯èœ
- OWASPãISOãMISRAãªã©ã®ã»ãã¥ãªãã£ããã³æ¥çæšæºãžã®æºæ ãä¿é²ããŸãã
SMART TS XL è€éãªC#ã·ã¹ãã ã®ç®¡ç匷åãæè¡çè² åµã®åæžããããŠé·æçãªãœãããŠã§ã¢ä¿å®æ§ã®åäžãç®æãçµç¹ã«æé©ã§ããæè»ãªã¢ãŒããã¯ãã£ãšãšã³ã¿ãŒãã©ã€ãºã°ã¬ãŒãã®æ©èœãåããæç¶å¯èœã§å®å šãª.NETéçºã«æ³šåããéçºè ãã¢ãŒããã¯ããITãªãŒããŒã«æé©ã§ãã
ãªã·ã£ãŒããŒ
JetBrainsãéçºããReSharperã¯ãC#ããã³.NETãšã³ã·ã¹ãã å šäœã察象ãšãããæã人æ°ãé«ããéçºè ã«ãšã£ãŠäœ¿ããããéçè§£æã»çç£æ§åäžããŒã«ã®äžã€ã§ããVisual Studioã«çŽæ¥çµ±åãããReSharperã¯ããªã¢ã«ã¿ã€ã ã®ã³ãŒãã€ã³ã¹ãã¯ã·ã§ã³ãã€ã³ããªãžã§ã³ããªææ¡ããªãã¡ã¯ã¿ãªã³ã°æ©èœãã³ãŒãããã²ãŒã·ã§ã³æ©èœã«ãããã³ãŒãã£ã³ã°ãšã¯ã¹ããªãšã³ã¹ãåäžãããŸããC#èšèªã®å¹ åºãæ©èœãšãã¬ãŒã ã¯ãŒã¯ããµããŒãããŠãããããå€ãã®ãããã§ãã·ã§ãã«éçºç°å¢ã§æ¬ ãããªãããŒã«ãšãªã£ãŠããŸãã
ReSharperã¯å ¥åãšåæã«ã³ãŒããè§£æããæ§æãšã©ãŒãæœåšçãªå®è¡æãã°ãããã³ãŒãã®èããä¿å®æ§ã«é¢ããæžå¿µãŸã§ãæ§ã ãªåé¡ç¹ããã€ã©ã€ã衚瀺ããŸããã¯ã€ãã¯ãã£ãã¯ã¹ã®ææ¡ãç¶æ³ã«å¿ãããªãã¡ã¯ã¿ãªã³ã°ã¢ã¯ã·ã§ã³ãæäŸããããšã§ãéçºè ã¯æå°éã®äœæ¥äžæã§ã³ãŒãå質ãåäžãããããšãã§ããŸããè§£ææ©èœã«å ãããŠããããã¹ãããŒã«ãã³ãŒãçæãã«ããŒãããã²ãŒã·ã§ã³ã·ã§ãŒãã«ãããæèŒãããŠãããéçºã¹ããŒããå€§å¹ ã«åäžãããŸãã
åªäœæ§
- Visual Studio ãšã®ç·å¯ãªçµ±åã«ãããã·ãŒã ã¬ã¹ãªéçºãšã¯ã¹ããªãšã³ã¹ãå®çŸ
- C#ãASP.NETãXAMLããã®ä»ã®.NETèšèªã®ãªã¢ã«ã¿ã€ã ã³ãŒãæ€æ»
- 2,000以äžã®ã³ãŒãå質ãã§ãã¯ãšæ°åã®ãªãã¡ã¯ã¿ãªã³ã°
- å€§èŠæš¡ãªã³ãŒãããŒã¹ãæ¢çŽ¢ããããã®å³æã³ãŒãããã²ãŒã·ã§ã³ããã³æ€çŽ¢ããŒã«
- ã³ã³ããã¹ãã«å¿ããã³ãŒãè£å®ãšæ§æã®ææ¡
- ããŒã åºæã®åºæºã«åãããŠã«ã¹ã¿ãã€ãºå¯èœãªæ€æ»ã®å³ãããšã«ãŒã«
- NUnitãMSTestãxUnit ãªã©ããµããŒãããçµã¿èŸŒã¿ã®ãŠããã ãã¹ã ã©ã³ããŒ
å¶éãšæ¬ ç¹
ReSharper ã«ã¯é·æãããã«ãããããããå€§èŠæš¡ãªããŸã㯠CI çµ±åãããéçè§£æã®ãŠãŒã¹ã±ãŒã¹ãžã®é©åæ§ã«åœ±é¿ããå¯èœæ§ã®ãããé¡èãªå¶éããããŸãã
- ããã©ãŒãã³ã¹ã®ãªãŒããŒããã
ReSharperã¯ãç¹ã«å€§èŠæš¡ãªãœãªã¥ãŒã·ã§ã³ã«ãããŠãVisual Studioã®ã¡ã¢ãªäœ¿çšéãšèµ·åæéãå€§å¹ ã«å¢å ãããããšãç¥ãããŠããŸããIDEã®å¿çé床ãäœäžãããå¯èœæ§ããããè€éãªãšã³ã¿ãŒãã©ã€ãºã³ãŒãããŒã¹ãæ±ãéçºè ã«ãšã£ãŠã¹ãã¬ã¹ã®èŠå ãšãªããŸãã - ã¹ã¿ã³ãã¢ãã³ã® CLI ãŸã㯠CI ããŒã«ãã§ãŒã³çµ±åãªã
ReSharperã¯Visual Studioå ã§ã€ã³ã¿ã©ã¯ãã£ãã«äœ¿çšã§ããããã«èšèšãããŠããŸããCI/CDãã€ãã©ã€ã³ãžã®çµ±åã®ããã®ãå®å šã«ãµããŒããããã¹ã¿ã³ãã¢ãã³ã®ã³ãã³ãã©ã€ã³ã€ã³ã¿ãŒãã§ãŒã¹ã¯æäŸãããŠããªããããç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ã¯ãŒã¯ãããŒã«ãããèªåå質ã²ãŒããžã®äœ¿çšã¯å¶éãããŸãã - éå®çãªå»ºç¯åæ
ReSharper ã¯ã³ãŒãã¬ãã«ã®åé¡ã«ã¯åªããŠããŸãããã¢ãŒããã¯ãã£äŸåé¢ä¿ããããã·ã¹ãã å šäœã®åŒã³åºãã°ã©ãããã€ã¯ããµãŒãã¹ãã¯ãã¹ãªããžããªç°å¢ã«ãããé«åºŠãªãããŒåæã¯æäŸããŸããã - ã¯ãã¹ã©ã³ã²ãŒãžã³ãŒãããŒã¹ã«ã¯é©ããŠããŸãã
ReSharperã¯äž»ã«.NETã«ç¹åããŠããŸããJavaãC++ãCOBOLãªã©ã®å€èšèªã·ã¹ãã ããµããŒãããŠããªãããããã€ããªããç°å¢ãã¬ã¬ã·ãŒç°å¢ã®ã¢ããã€ãŒãŒã·ã§ã³ã«ãããŠã¯å¹æãéå®ãããŸãã - åçšã©ã€ã»ã³ã¹
ReSharperã¯ãã·ãŒãåäœã®ã©ã€ã»ã³ã¹ãå¿ èŠãªææè£œåã§ããå€§èŠæš¡ãªããŒã ã«ãšã£ãŠããŠãŒã¶ãŒããšã®ã³ã¹ããªãã§ããåºç¯ãªèªååãæäŸãããªãŒãã³ãœãŒã¹ããŒã«ãCIããŒã¹ã®ããŒã«ãšæ¯èŒãããšãããã¯å€§ããªè² æ ãšãªãå¯èœæ§ããããŸãã - ã»ãã¥ãªãã£ã¹ãã£ã³ãçµã¿èŸŒãŸããŠããªã
ReSharperã«ã¯ãã€ã³ãžã§ã¯ã·ã§ã³è匱æ§ãå®å šã§ãªãæå·åãèªèšŒåé¡ã®æ€åºãšãã£ãå°çšã®éçã¢ããªã±ãŒã·ã§ã³ã»ãã¥ãªãã£ãã¹ãïŒSASTïŒæ©èœãæ¬ ããŠããŸããå®å šãªéçºãå®çŸããã«ã¯ãè£å®çãªããŒã«ãå¿ èŠã§ãã
ReSharperã¯ãVisual Studioå ã§å人ããã³ããŒã ã®çç£æ§ãåäžãããããã®ãããã¯ã©ã¹ã®ããŒã«ã§ãããè¿ éãªéçºãµã€ã¯ã«ãšã³ãŒãã¬ãã¥ãŒã«æé©ã§ãããã ããCIãã¡ãŒã¹ããã¹ã±ãŒã©ãã«ããŸãã¯ã»ãã¥ãªãã£éèŠã®éçè§£æãæ±ããçµç¹ã§ã¯ãä»ã®ããŒã«ãè£å®ããå¿ èŠããããããããŸããã
Roslynã¢ãã©ã€ã¶ãŒ
Roslyn Analyzer ã¯ãææ°ã® C# ããã³ Visual Basic .NET ã³ã³ãã€ã©ãæ¯ãã Roslyn ã³ã³ãã€ã© ãã©ãããã©ãŒã äžã«æ§ç¯ããããªãŒãã³ãœãŒã¹ã®èšºæããŒã« ã»ããã§ããMicrosoft ã«ãã£ãŠéçºããã³ä¿å®ãããŠãããããã®ã¢ãã©ã€ã¶ãŒã«ãããéçºè 㯠.NET ãšã³ã·ã¹ãã å ã§ã«ã¹ã¿ã ã®éçã³ãŒã ã«ãŒã«ãèšè¿°ãé©çšãæ¡åŒµã§ããŸãããã«ã ããã»ã¹ãš Visual Studio ã«çŽæ¥çµ±åãããŠããããã軜éã§ãããŒã«ã«éçºãšç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ã®äž¡æ¹ã§å¹æçã«äœ¿çšã§ããŸãã
Roslyn ã¢ãã©ã€ã¶ãŒã¯ãMicrosoft.CodeAnalysisã.NET SDK ã¢ãã©ã€ã¶ãŒããã㊠Microsoft ç¬èªã®ã»ãã¥ãªãã£ãAPIãäºææ§ã¬ã€ãã©ã€ã³ãªã©ãä»ã®å€ãã®ã«ãŒã«ã»ããã®åºç€ãšãªã£ãŠããŸããã³ãŒãã®äžè²«æ§ã確ä¿ããäžè¬çãªãã°ãæ€åºããC# ãããžã§ã¯ãå šäœã«ã¹ã±ãŒã©ãã«ãã€èªåçã«ã¹ã¿ã€ã«ã«ãŒã«ãé©çšããã®ã«æé©ã§ãã
åªäœæ§
- .NET SDKã«çµã¿èŸŒãŸããMicrosoftã«ãã£ãŠãµããŒããããŠããŸã
- å ¬åŒã®Microsoftã¬ã€ãã©ã€ã³ãšã¹ã¿ã€ã«èŠåãé©çšããŸã
- Visual Studio ããã³ MSBuild ããã»ã¹ã«ãã€ãã£ãã«çµ±å
- æè»ãªAPIã䜿çšããŠC#ã§ã«ã¹ã¿ã ã«ãŒã«ã®äœæããµããŒã
- ãªã¢ã«ã¿ã€ã ãã£ãŒãããã¯ãšCIãã€ãã©ã€ã³çµ±åã«å¹çç
- OmniSharp çµç±ã§ Visual Studio Code ãšäºææ§ãã
- ã³ãã¥ããã£äž»å°ã§ç¶ç¶çãªã¢ããããŒããšã«ãŒã«ã®æ¹åã宿œ
å¶éãšæ¬ ç¹
Roslyn Analyzers ã¯å®çšçã§ãã€ãã£ãã«çµ±åãããŠããŸãããé«åºŠãªéçåæã®ããŒãºãæºããã«ã¯äžååãªéšåãããã€ããããŸãã
- ã³ãŒããããŒãšã¢ãŒããã¯ãã£ã®åæã®æ·±ââããéãããŠãã
Roslynã¢ãã©ã€ã¶ãŒã¯äž»ã«æ§æãšæå³ã¬ãã«ã§åäœããŸãããšã³ã¿ãŒãã©ã€ãºããŒã«ã®ãããªãæç¶ãéã®è©³çްãªãããŒè§£æããããžã§ã¯ãéã®äŸåé¢ä¿ãããã³ã°ãã¢ãŒããã¯ãã£ã«ãŒã«ã®é©çšãšãã£ãæ©èœã¯åããŠããŸããã SMART TS XL ãŸã㯠NDepend ãªãã¡ãŒã - çµã¿èŸŒã¿ã®ã»ãã¥ãªãã£ã«ãŒã«ã»ããã®æ¬ åŠ
Roslyn ã¢ãã©ã€ã¶ãŒã¯ãå ¥åããŒã¿ã®ãµãã¿ã€ãºãããŒã¿æŒæŽ©ãå®å šã§ãªã API ã®äœ¿çšãšãã£ãã»ãã¥ãªãã£äžã®è匱æ§ã«çŠç¹ãåœãŠãŠããŸãããSAST æ©èœãå©çšããã«ã¯ãã»ãã¥ãªãã£ã«éç¹ã眮ããæ¡åŒµæ©èœïŒäŸïŒMicrosoft Security Code AnalysisïŒãå¿ èŠã§ãã - æå°éã®èŠèŠåããŒã«
è€éãªã³ãŒãããŒã¹ãçè§£ããããã®ã³ãŒã«ã°ã©ããäŸåé¢ä¿ã°ã©ãããªããUIã€ã³ã¿ãŒãã§ãŒã¹ã¯ãµããŒããããŠããŸãããéçºè ã¯ãèŠèŠçãªãã£ãŒãããã¯ãåŸãããã«ãããã¹ãåºåããµãŒãããŒãã£ã®çµ±åã«é ŒããããåŸãŸããã - ã«ã¹ã¿ã ã«ãŒã«ã®ã¡ã³ããã³ã¹ãªãŒããŒããã
ã«ãŒã«ã®ã«ã¹ã¿ãã€ãºã¯åŒ·åã§ãããRoslyn APIã«é¢ããæ·±ãç¥èãšãã³ãŒãããŒã¹ã®é²åã«äŒŽã宿çãªã¡ã³ããã³ã¹ãå¿ èŠã§ããããã¯ãå°çšã®ããŒã«ã«é¢ããå°éç¥èãæããªãããŒã ã«ãšã£ãŠã¯è² æ ãšãªãå¯èœæ§ããããŸãã - åºæ¬çãªãšã©ãŒå ±åãšã¯ãŒã¯ãããŒçµ±å
SonarQube ã CodeQL ãªã©ã®ããŒã«ãšæ¯èŒãããšãRoslyn Analyzers ã§ã¯ã¬ããŒãããã·ã¥ããŒããåé¡è¿œè·¡æ©èœãGitHub PR ã¬ãã¥ãŒã Jira ãªã©ã®ãã©ãããã©ãŒã ãšã®çµ±åãå¶éãããŠããŸãã - å€èšèªãœãªã¥ãŒã·ã§ã³ã«ã¯é©ããŠããŸãã
ãããã®ã¢ãã©ã€ã¶ãŒã¯C#ãšVB.NETã«ç¹åããŠãããJavaScriptãC++ãCOBOLããã®ä»ã®ãšã³ã¿ãŒãã©ã€ãºèšèªãå«ãæ··åã¹ã¿ãã¯ã¯åŠçã§ããŸããã
Roslyn Analyzer ã¯ãC# ã³ãŒãã®å質ãç¶æããããã®è»œéãã€å¹æçãªç¬¬äžç·é²è¡ããŒã«ã§ããäžè²«æ§ã®ç¢ºä¿ãåçŽãªåé¡ã®æ©æçºèŠãæå°éã®èšå®ã§ CI ã¯ãŒã¯ãããŒã«çµ±åããã®ã«æé©ã§ããããããããæ·±ãåæãã»ãã¥ãªãã£ã³ã³ãã©ã€ã¢ã³ã¹ãã¢ãŒããã¯ãã£ã¬ããã³ã¹ãå¿ èŠãšããçµç¹ã«ãšã£ãŠãRoslyn Analyzer ã¯ããå ç¢ãªéçè§£æãã©ãããã©ãŒã ãšçµã¿åãããããšã§ãæå€§éã®å¹æãçºæ®ããŸãã
NDepend
NDepend ã¯ãC# ãå«ã .NET ã³ãŒãããŒã¹åãã«ç¹å¥ã«èšèšããã匷åãªéçè§£æããã³ã¢ãŒããã¯ãã£ã¬ããã³ã¹ããŒã«ã§ããé«åºŠãªã³ãŒãã¡ããªã¯ã¹ãäŸåé¢ä¿ã®å¯èŠåãã³ãŒãã«ãŒã«ã®é©çšãæè¡çè² åµã®è¿œè·¡ãšãã£ãæ©èœãæäŸããŸããNDepend 㯠Visual Studio ã CI/CD ãã€ãã©ã€ã³ãšçµ±åãããç¬èªã® LINQ ããŒã¹ã®ã¯ãšãªèšèª (CQLinq) ãä»ããŠã«ã¹ã¿ã ã«ãŒã«å®çŸ©ããµããŒãããŸãã
NDepend ã®äž»ãªåŒ·ã¿ã¯ãã³ãŒãæ§é ãã¢ãŒããã¯ãã£ã®äžè²«æ§ããããŠäŒæ¥å šäœã«ãããã³ãŒãã£ã³ã°æšæºã®é©çšã«é¢ããæ·±ãæŽå¯åã«ãããŸããè€éãªããããã¯é·æã«ããã .NET ãœãªã¥ãŒã·ã§ã³ã«åãçµãããŒã ã«ãšã£ãŠãNDepend ã¯é«ãã¬ãã«ã®éææ§ãšä¿å®æ§ãæäŸããŸãã
åªäœæ§
- åºç¯ãªã³ãŒãã¡ããªã¯ã¹ïŒäŸïŒåŸªç°çè€é床ãçµå床ãåé床ïŒ
- ã¢ãŒããã¯ãã£ã®èŠèŠåã®ããã®äŸåé¢ä¿ã°ã©ããšãããªãã¯ã¹
- ã³ãŒãã«ãŒã«ãèšè¿°ããã³ã«ã¹ã¿ãã€ãºããããã® CQLinq ã¯ãšãªèšèª
- æéã®çµéã«äŒŽãåŸååæãšæè¡çè² åµã®è¿œè·¡ããµããŒãããŸã
- Visual Studio ããã³ Azure DevOps ãšã®çµ±å
- ãœãŒã¹ã³ãŒããšã³ã³ãã€ã«ãããã¢ã»ã³ããªã®äž¡æ¹ã«å¯Ÿããéçè§£æ
- ã³ãŒãã®èããã¢ã³ããã¿ãŒã³ãæœåšçãªãªãã¡ã¯ã¿ãªã³ã°å¯Ÿè±¡ãæ€åºããŸã
- å€§èŠæš¡ãéå±€åããŸãã¯ã¬ã¬ã·ãŒãªãšã³ã¿ãŒãã©ã€ãº ã³ãŒãããŒã¹ã«æé©
å¶éãšæ¬ ç¹
NDepend ã¯ãåæãšèŠèŠåã«ãããŠæ¯é¡ã®ãªãæ·±ããå®çŸããŸãããç¹å®ã®ç°å¢ã§ã®å°å ¥ã«åœ±é¿ãåãŒãå¯èœæ§ã®ããæ¬ ç¹ãããã€ããããŸãã
- è€éããšæ¥å³»ãªåŠç¿æ²ç·
NDepend ã®è±å¯ãªæ©èœãç¹ã« CQLinq ãšäŸåé¢ä¿ãããã³ã°ã¯ãåå¿è ã«ãšã£ãŠæã«è² ããªãå ŽåããããŸããããŒã ããã®æ©èœã广çã«æŽ»çšããã«ã¯ãã¬ãŒãã³ã°ãå¿ èŠã§ãããåå¿è ã«ãšã£ãŠã¯ã€ã³ã¿ãŒãã§ãŒã¹ãšèšå®ãçŽæçã§ã¯ãªããšæãããããããŸããã - éçºäžã®ãªã¢ã«ã¿ã€ã ãã£ãŒãããã¯ãéãããŠãã
ReSharperãRoslyn Analyzersãšãã£ãããšãã£ã¿ãŒå ã§å³åº§ã«èšºæçµæãæäŸããããŒã«ãšã¯ç°ãªããNDependã®ãã£ãŒãããã¯ã¯éåžžãè§£æåŸã«æäŸãããŸããéçºè ã¯çµæã確èªããããã«ãæåãŸãã¯ã¹ã±ãžã¥ãŒã«ãããå®è¡ãããªã¬ãŒããå¿ èŠãããå ŽåããããŸãã - Visual Studio ã®äŸåé¢ä¿
NDepend ã¯ã³ãã³ãã©ã€ã³ãš CI çµ±åãæäŸããŠããŸãããæãè±å¯ãªæ©èœãæäŸããã®ã¯ Visual Studio ã§ããRider ãŸã㯠Visual Studio Code ã䜿çšããŠããéçºè ã¯ãå®å šãªãµããŒããåããããªãå¯èœæ§ããããŸãã - äž»ã«ã¢ãŒããã¯ãã£ãšã¡ããªã¯ã¹çš
NDepend ã¯æ§é çããã³ã¢ãŒããã¯ãã£çãªæ€èšŒã«åªããŠããŸãããæ§æã¬ãã«ã®ãªã³ãã£ã³ã°ããã©ãŒãããã«ãŒã«ãšãã£ãç¹å®ã®é åã§ã¯æ·±ã¿ãæ¬ ããŠããŸããStyleCop ã EditorConfig ã®ããã«åœåèŠåã空çœã«ãŒã«ã匷å¶ããæ©èœã¯ãããŸããã - ã»ãã¥ãªãã£ã¹ãã£ã³ãçµã¿èŸŒãŸããŠããªã
ãã®ããŒã«ã¯ãSQLã€ã³ãžã§ã¯ã·ã§ã³ãå®å šã§ãªãæå·åããã¹ãã©ããŒãµã«ã®ãªã¹ã¯ãšãã£ãäžè¬çãªã»ãã¥ãªãã£è匱æ§ããã€ãã£ãã«æ€åºããŸãããã»ãã¥ãªãã£ãéèŠããçµç¹ã¯ã以äžã®ããŒã«ãšäœµçšããå¿ èŠããããŸãã SMART TS XLãCodeQLããŸã㯠Veracode ã§ãã - åçšã©ã€ã»ã³ã¹ã¢ãã«
NDepend ã¯ãã·ãŒãããšã®ã©ã€ã»ã³ã¹ãäŒŽãææè£œåã§ãããRoslyn Analyzers ã ESLint ãªã©ã®ç¡æã®ãªãã·ã§ã³ãšæ¯èŒãããšãå°èŠæš¡ãªããŒã ããªãŒãã³ãœãŒã¹ã®è²¢ç®è ã«ãšã£ãŠã¯é«é¡ã«ãªãå¯èœæ§ããããŸãã - å€èšèªã³ãŒãããŒã¹ã«ã¯é©ããŠããªã
NDepend 㯠.NET äžå¿ã®ããŒã«ã§ããããããã«ã¹ã¿ãã¯ãŸãã¯åŸæ¥ã®ãšã³ã¿ãŒãã©ã€ãºç°å¢ã§ããèŠããã JavaScriptãPythonãCOBOLããã®ä»ã®é .NET èšèªããµããŒãããŠããŸããã
NDependã¯ãC#ãããžã§ã¯ãã«ãããé·æçãªã³ãŒãå質ãšã¢ãŒããã¯ãã£ã®æç¢ºããç¶æããããã®æŠç¥çãªãœãªã¥ãŒã·ã§ã³ã§ããæ§é äžã®æ·±å±€åé¡ã®æ€åºã«åªããŠãããããŒã ãæè¡çè² åµãå®éåããéå±€åèšèšã匷å¶ããã®ã«åœ¹ç«ã¡ãŸããããããå æ¬çãªéçºã¯ãŒã¯ãããŒã«ãããŠã軜éã§ãªã¢ã«ã¿ã€ã ãªãªã³ã¿ãŒãã»ãã¥ãªãã£ããŒã«ãšçµã¿åãããããšã§ãæå€§éã®å¹æãçºæ®ããŸãã
PVSã¹ã¿ãžãª
PVS-Studioã¯ãProgram Verification Systems瀟ãéçºããéçã³ãŒãã¢ãã©ã€ã¶ãŒã§ãCãC++ãC#ãJavaãå«ãè€æ°ã®èšèªããµããŒãããŠããŸããC#ã®å ŽåãVisual Studioã«çµ±åããããã°ãã³ãŒãã¹ã¡ã«ãåæå®è¡ã®åé¡ãã»ãã¥ãªãã£è匱æ§ãæ€åºããããã®è©³çްãªåææ©èœãæäŸããŸããPVS-Studioã¯é«æ§èœãªæ€åºæ©èœãéèŠããŠãããçµã¿èŸŒã¿ã·ã¹ãã ãéèãµãŒãã¹ãå€§èŠæš¡ãšã³ã¿ãŒãã©ã€ãºã¢ããªã±ãŒã·ã§ã³ã®å€ãã®ããŒã ã§äœ¿çšãããŠããŸãã
åºæ¬çãªæ§æãšã©ãŒã«ãšã©ãŸããã埮现ãªããžãã¯ã®åé¡ãæªå®çŸ©ã®åäœãã³ãŒãã£ã³ã°ãã¿ãŒã³éåãªã©ãæ€åºããå æ¬çãªã«ãŒã«ã»ãããæäŸããŸãããã®ããŒã«ã¯ãæåãšCIçµ±åã®äž¡æ¹ã®åæã¯ãŒã¯ãããŒããµããŒãããŠããŸãã
åªäœæ§
- è«ççãªæ¬ é¥ããããã©ãŒãã³ã¹ã®éå¹çæ§ãŸã§ãC# ã®ããŸããŸãªãšã©ãŒ ã¿ã€ããæ€åºããŸãã
- Visual Studioãšã·ãŒã ã¬ã¹ã«çµ±åããMSBuildããŒã¹ã®ãããžã§ã¯ãããµããŒãããŸã
- èªååãšCI/CDãã€ãã©ã€ã³ã®äœ¿çšã®ããã®ã³ãã³ãã©ã€ã³ã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããŸã
- é倧床ãšèª€æ€ç¥ã®å¯èœæ§ã«å¿ããŠèŠåãåé¡ããŸã
- 誀æ€ç¥æå¶ã¡ã«ããºã ã®å°çšããŒã¿ããŒã¹ãç¶æ
- ãã¹ãŠã®èšºæã«ãŒã«ã«ã€ããŠè©³çްãªããã¥ã¡ã³ããšäŸãæäŸããŸã
- å€§èŠæš¡ãããžã§ã¯ãã§ã®ããã©ãŒãã³ã¹åäžã®ããã«å¢ååæããµããŒã
å¶éãšæ¬ ç¹
PVS-Studio ã¯æè¡çã«åªããŠããŸãããç¹å®ã®ç°å¢ã§ã¯å°å ¥ãæå¹æ§ãå¶éããå¯èœæ§ã®ããåŽé¢ãããã€ããããŸãã
- 詳现ãªåºåãšèŠåé³
PVS-Studio ã¯ãç¹ã«ååå®è¡æã«å€æ°ã®èŠåãåºåããããšããããŸããæå¶ããŒã«ã¯å«ãŸããŠããŸãããåæã®ãã€ãºãå§åçã«å€ããããå®çšçã«äœ¿çšããããã«èª¿æŽã«å€å€§ãªåŽåãè²»ããå¿ èŠããããŸãã - ã«ãŒã«ã®ã«ã¹ã¿ãã€ãºãå¶éãããŠãã
Roslyn AnalyzersãNDependãšã¯ç°ãªããPVS-Studioã¯åŒ·åãªã«ã¹ã¿ã ã«ãŒã«ãšã³ãžã³ãæäŸããŠããŸãããéçºè ã¯ã瀟å ã¢ãŒããã¯ãã£ãã³ãŒãã£ã³ã°æšæºã«åãããŠã«ã¹ã¿ãã€ãºãããã«ã¹ã¿ã ã«ãŒã«ãç°¡åã«å®çŸ©ããããšã¯ã§ããŸããã - 建ç¯ã«é¢ããæŽå¯åã®æ¬ åŠ
ãã®ããŒã«ã¯ãã¢ãŒããã¯ãã£æ€èšŒã§ã¯ãªããäž»ã«ãšã©ãŒæ€åºã«éç¹ã眮ããŠããŸããäŸåé¢ä¿ã°ã©ãããµã€ã¯ãããã£ãã¯è€é床ã®è¿œè·¡ãéå±€åèšèšã®é©çšãšãã£ãæ©èœã¯æäŸãããŠããŸããã - é«é¡ãªã©ã€ã»ã³ã¹è²»çš
PVS-Studioã¯åçšããŒã«ã§ãããã©ã€ã»ã³ã¹ã¢ãã«ã¯å°èŠæš¡ãªéçºããŒã ãæè²æ©é¢ã«ãšã£ãŠã¯é«é¡ã«ãªãå¯èœæ§ããããŸããè©ŠçšæéçµäºåŸã®ãããã§ãã·ã§ãã«ãŠãŒã¹åãã®ç¡æãã©ã³ã¯æäŸãããŠããŸããã - éçºè
ã«ãšã£ãŠããŸããã¬ã³ããªãŒã§ã¯ãªãUX
Visual Studio ãšã®çµ±åã¯æ©èœããŸãããã€ã³ã¿ãŒãã§ãŒã¹ã«ã¯ãReSharper ã SonarQube ããã·ã¥ããŒããªã©ã®ããŒã«ã«èŠãããæŽç·Žãããæ©èœã䜿ããããã®äžéšãæ¬ ããŠããŸãã - ã»ãã¥ãªãã£éèŠã¯å°çšã®SASTããŒã«ã»ã©å
ç¢ã§ã¯ãªã
PVS-Studio ã¯ã»ãã¥ãªãã£é¢é£ã®åé¡ãããã€ãæ€åºããŸãããå°çšã®éçã¢ããªã±ãŒã·ã§ã³ã»ãã¥ãªãã£ãã¹ããã©ãããã©ãŒã ã®ä»£æ¿ã«ã¯ãªããŸãããOWASP ã«ãŒã«ã»ããããã€ã³ãåæãè匱æ§ã¹ã³ã¢ãªã³ã°æ©èœã®çµ±åãæ¬ ããŠããŸãã - äž»ã«Microsoftã¹ã¿ãã¯ã«çŠç¹ãåœãŠãŠããŸã
ãã®ããŒã«ã¯è€æ°ã®èšèªããµããŒãããŠããŸãããC#ã®åªããæ©èœã¯Microsoftãšã³ã·ã¹ãã ã«äŸåããŠããŸããã¯ãã¹ãã©ãããã©ãŒã ã®.NET CoreãVS Codeã®äœ¿çšã¯ãããã«æ¯ã¹ããšå¶éãããããã«æãããããããŸããã
PVS-Studioã¯ãä»ã®ã¢ãã©ã€ã¶ãŒã§ã¯èŠéãããã¡ãªC#ã³ãŒãã®æ¬ é¥ãé ããåé¡ã衚é¢åããããæçããæè¡çã«åªããããŒã«ã§ããç¹ã«ãã¬ã¬ã·ãŒãããžã§ã¯ããå®å šæ§ãéèŠãããã·ã¹ãã ããããŠå質管çã®åŒ·åãå¿ èŠãªããŒã ã«ãšã£ãŠæçšã§ãããã ããã«ãŒã«ã®ã«ã¹ã¿ãã€ãºãã¢ãŒããã¯ãã£å¶åŸ¡ããããã¯ãããŠãŒã¶ãŒãã¬ã³ããªãŒãªã¯ãŒã¯ãããŒãæ±ããçµç¹ã«ãšã£ãŠã¯ãããã€ã³ã¿ã©ã¯ãã£ããªããŒã«ãæŠç¥çãªããŒã«ãšçµã¿åãããå¿ èŠããããããããŸããã
ã³ããªãã£ïŒã·ããã·ã¹ïŒ
Coverityã¯ãC#ãå«ãå¹ åºãããã°ã©ãã³ã°èšèªããµããŒããããšã³ã¿ãŒãã©ã€ãºã°ã¬ãŒãã®éçã¢ããªã±ãŒã·ã§ã³ã»ãã¥ãªãã£ãã¹ãïŒSASTïŒããŒã«ã§ããã³ãŒãã®ã»ãã¥ãªãã£ãä¿¡é Œæ§ãã³ã³ãã©ã€ã¢ã³ã¹ãéèŠããŠãããããéèãèªç©ºå®å®ããã«ã¹ã±ã¢ããã®ä»ã®èŠå¶ç£æ¥ã®çµç¹ã§åºãæ¡çšãããŠããŸãã
Coverityã¯ã詳现ãªéçè§£æã宿œããé倧ãªãœãããŠã§ã¢æ¬ é¥ãã»ãã¥ãªãã£è匱æ§ãåæå®è¡æ§ã®åé¡ãã³ã³ãã©ã€ã¢ã³ã¹éåãæ€åºããŸããCWEãOWASP Top 10ãMISRAãªã©ã®æ¥çæšæºã«æºæ ããŠãããå€§èŠæš¡ãªã³ãŒãããŒã¹ãžã®æ¡åŒµæ§ãšãšã³ã¿ãŒãã©ã€ãºã¬ãã«ã®ã¬ããŒãæ©èœã§ç¥ãããŠããŸãã
åªäœæ§
- ãããã¡ãªãŒããŒãããŒãã€ã³ãžã§ã¯ã·ã§ã³æ¬ é¥ãå®å šã§ãªãAPIãªã©ã®é«åºŠãªèåŒ±æ§æ€åº
- æ¥çæšæºïŒCWEãOWASPãPCI DSS ãªã©ïŒãšã®åŒ·åãªã³ã³ãã©ã€ã¢ã³ã¹æºæ
- Visual Studio ããã³ JenkinsãGitHub ActionsãAzure DevOps ãªã©ã® CI/CD ãã©ãããã©ãŒã ãšçµ±åããŸãã
- æ¬ é¥ä¿®æ£ã®ããã®ã³ãŒãããªã¢ãŒãžããŒã«ãšå ±åã¯ãŒã¯ãããŒãæäŸããŸã
- ããã©ãŒãã³ã¹éèŠã®åæãšã³ãžã³ã§å€§èŠæš¡ãªãšã³ã¿ãŒãã©ã€ãºã³ãŒãããŒã¹ãåŠç
- äžå åãããããã·ã¥ããŒããšç£æ»æ©èœããµããŒã
- ã»ãã¥ãªãã£ãšå®å šæ§ãéèŠããé«å質ã®ã«ãŒã«ã»ãããæäŸããŸã
å¶éãšæ¬ ç¹
Coverity ã¯ãç¹ã«èŠå¶ãããç°å¢ã«ãããå®å šãªã³ãŒãåæã«åªããŠããŸãããéçºè ãš DevOps ããŒã ãèªèããŠããã¹ããã¬ãŒããªãã䌎ããŸãã
- ã»ããã¢ãããšã€ã³ãã©ã¹ãã©ã¯ãã£ã®ãªãŒããŒããããéã
Coverityã¯ãããã¯ãšã³ããµãŒããŒãã¹ãã£ã³ã€ã³ãã©ã®èšå®ãªã©ãããªãã®ã»ããã¢ãããå¿ èŠã§ããå°ä»»ã®DevSecOpsãªãœãŒã¹ãæããªããåãã®éãããŒã ãå°èŠæš¡ãããžã§ã¯ãã«ã¯é©ããŠããŸããã - ã©ã€ã»ã³ã¹ãšãµããŒãã®ã³ã¹ããé«ã
äŸ¡æ Œäœç³»ã¯å€§äŒæ¥åãã§ããå°èŠæš¡äŒæ¥ãããªãŒã©ã³ã¹éçºè ã«ãšã£ãŠã¯ããªãŒãã³ãœãŒã¹ã軜éãªä»£æ¿è£œåãšæ¯èŒããŠãã©ã€ã»ã³ã¹ã³ã¹ããæ³å€ã«é«é¡ã«æããããã§ãããã - ã³ãŒãã£ã³ã°äžã®ãªã¢ã«ã¿ã€ã ãã£ãŒãããã¯ãéãããŠãã
Coverityã¯ãããã¢ãŒããŸãã¯CIããŒã¹ã®ã¹ãã£ã³ã§æã广çã«åäœããŸããéçºè ã¯ãRoslynã¢ãã©ã€ã¶ãŒãReSharperããŸãã¯Visual Studioã®çµã¿èŸŒã¿ããŒã«ã®ããã«ã峿ã®ã€ã³ã©ã€ã³ãã£ãŒãããã¯ãåŸãããšãã§ããŸããã - èšå®ã®åŠç¿æ²ç·ãæ¥å³»
åæãããã¡ã€ã«ãæå¶ããŸãã¯ã«ãŒã«ãã«ã¹ã¿ãã€ãºããã«ã¯ãCoverityç¬èªã®èšå®ãšã³ã·ã¹ãã ã«é¢ãããã¬ãŒãã³ã°ãšç¥èãå¿ èŠã§ããããã¥ã¡ã³ãã¯è±å¯ã§ãããå 容ãè€éã«ãªãå ŽåããããŸãã - ä¿å®æ§ãã¢ãŒããã¯ãã£ãããã»ãã¥ãªãã£ã«éç¹ã眮ã
Coverity ã¯ã»ãã¥ãªãã£ãšä¿¡é Œæ§ã®æ€åºã«ç¹åããŠããŸãããäŸåé¢ä¿ã°ã©ããæè¡çè² åµã®è¿œè·¡ãNDepend ãªã©ã®ããŒã«ãæäŸããåŸåã¡ããªãã¯ãªã©ã®ã¢ãŒããã¯ã㣠ããŒã«ãæ¬ ããŠããŸãã - UIãšãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãææ°åãããŠããªã
éçºè ã€ã³ã¿ãŒãã§ãŒã¹ãšããã·ã¥ããŒãã¯æ©èœçã§ã¯ãããã®ã®ãçŸä»£ã®ãã¶ã€ã³åºæºã«ã¯é ãããšã£ãŠããŸããSonarQubeãCodeClimateãšãã£ããŠãŒã¶ãŒäžå¿ã®ããŒã«ãšæ¯èŒãããšãCoverityã¯æä»£é ãã§æ±ãã«ãããšæãããããããŸããã - 誀æ€ç¥ãé¿ããããã«å®æçãªèª¿æŽãå¿
èŠ
Coverityã¯ãã®ç²ŸåºŠã®é«ãã§é«ãè©äŸ¡ãããŠããŸãããç¹ã«é«åºŠãªèšèªæ©èœãã«ã¹ã¿ã ãã¬ãŒã ã¯ãŒã¯ã䜿çšããå Žåã誀æ€ç¥ãçºçãããšããå ±åãäžéšãŠãŒã¶ãŒããå¯ããããŠããŸãããã®ãããã«ãŒã«ãšæå¶æ©èœã®ç¶ç¶çãªæ¹è¯ãæ±ããããŠããŸãã
Coverityã¯ãã»ãã¥ãªãã£ãã³ã³ãã©ã€ã¢ã³ã¹ããããŠã³ãŒãã®æ£ç¢ºæ§ã絶察äžå¯æ¬ ãªçµç¹ã«ãšã£ãŠãæé«ã¬ãã«ã®ãœãªã¥ãŒã·ã§ã³ã§ããå€§èŠæš¡ãªã³ãŒãããŒã¹ãèŠå¶å¯Ÿè±¡ã®ã³ãŒãããŒã¹ããããã¯ã¬ã¬ã·ãŒã³ãŒãããŒã¹ãªã©ã峿 Œãªæ¬ é¥åæãæ±ããããç°å¢ã«æé©ã§ããããããªããããšã³ã¿ãŒãã©ã€ãºã°ã¬ãŒãã§ãããããé©åãªãµããŒããšãã¬ãŒãã³ã°ããªãå°èŠæš¡ãªããŒã ãæ¥éãªéçºç°å¢ã«ã¯ãä¿ææ§ãè»œéæ§ãååã§ã¯ãªãå¯èœæ§ããããŸãã
ã³ãŒãã©ãã·ã¥
DevExpressã®CodeRushã¯ãã³ãŒãããã²ãŒã·ã§ã³ããªãã¡ã¯ã¿ãªã³ã°ãéçã³ãŒãåææ©èœãåããVisual Studioã®çç£æ§åäžæ¡åŒµæ©èœã§ããéçºè ãšã¯ã¹ããªãšã³ã¹ãéèŠããŠèšèšãããCodeRushã¯ãã³ãŒãã®å質ãšä¿å®æ§ãåäžããããšåæã«ãC#ã³ãŒãã®èšè¿°ãèªã¿åããããã²ãŒã·ã§ã³ã®å¹çæ§ãé«ããŸãã
CodeRush ã¯ãCoverity ã PVS-Studio ã®ãããªçŽç²ãªéçã³ãŒã ã¢ãã©ã€ã¶ãŒã§ã¯ãããŸããããéçºè ããã¹ã ãã©ã¯ãã£ã¹ãéµå®ãããšã©ãŒãåé¿ããã³ãŒãããŒã¹ãç°¡çŽ åããã®ã«åœ¹ç«ã€ãªã¢ã«ã¿ã€ã ã³ãŒã蚺æãšã³ãžã³ãçµã¿èŸŒãã§ããŸãã
åªäœæ§
- æå°éã®ã»ããã¢ããã§ Visual Studio ã«çŽæ¥çµ±å
- éçºè ãã³ãŒããæžãéã«ãå³åº§ã«éçã³ãŒãåæãšææ¡ãæäŸããŸãã
- 100以äžã®èªåãªãã¡ã¯ã¿ãªã³ã°ãšã³ãŒããã©ãŒãããããŒã«ãå«ãŸããŠããŸã
- æœåšçãªããã©ãŒãã³ã¹ã®åé¡ãæªäœ¿çšã®ã³ãŒããæªãç¿æ £ã匷調衚瀺ããŸã
- ã³ãŒãã¡ããªã¯ã¹ãäŸåé¢ä¿åæãã³ãŒãã«ãã¬ããžãªã©ã®èŠèŠçãªããŒã«ãæäŸããŸã
- äžè¬çãªéçºè ã¿ã¹ã¯ãå¹çåããŸã (äŸ: ååã®å€æŽããã©ã¡ãŒã¿ã®äžŠã¹æ¿ããå¯èŠæ§ã®å€æŽ)
- ãããžã§ã¯ããŸãã¯éçºè ã®èšå®ããšã«ã«ãŒã«ã®èšå®ãšæå¶ãå¯èœ
- 軜éãã€é«éã§ãææ°ã® C# ã¯ãŒã¯ãããŒããµããŒãããããã«èšèšãããŠããŸã
å¶éãšæ¬ ç¹
CodeRush ã¯ãåã ã®éçºè ãå°èŠæš¡ããŒã ã«ãšã£ãŠé åçã§ããããšã³ã¿ãŒãã©ã€ãº ã°ã¬ãŒãã®éçè§£æã·ããªãªã§ã¯ãã®æçšæ§ãå¶éããå¶çŽãããã€ããããŸãã
- å°çšã®SASTãŸãã¯ã»ãã¥ãªãã£ã¹ãã£ãã§ã¯ãªã
CodeRushã¯ãã³ãŒãã®ã¹ã¿ã€ã«ãæ§é ããããŠéçºè ã®çç£æ§ã«éç¹ã眮ããŠããŸããèåŒ±æ§æ€åºãOWASPãCWEãªã©ã®æšæºãžã®æºæ ã«ã¯ç¹åããŠããŸããã - ãšã³ã¿ãŒãã©ã€ãºã¬ããŒãæ©èœãäžè¶³ããŠãã
äžå åãããããã·ã¥ããŒããæ¬ é¥åŸåã®è¿œè·¡ããŸã㯠CI ãã€ãã©ã€ã³å šäœã«ãããããŒã å šäœã®åæã«é©ããã¬ããŒãæ©èœã¯æäŸãããŸããã - ã«ãŒã«ã®æ¡åŒµæ§ãéãããŠãã
Roslyn ã¢ãã©ã€ã¶ãŒã NDepend ãªã©ã®ããŒã«ãšæ¯èŒãããšãCodeRush ã¯ã«ã¹ã¿ã ã®éçåæã«ãŒã«ãã¢ãŒããã¯ãã£äžã®å¶çŽãæ§ç¯ããã³é©çšããããã®åºç¯ãªãã¬ãŒã ã¯ãŒã¯ãæäŸããŸããã - ã³ãã³ãã©ã€ã³ãŸãã¯CI/CDçµ±åãªã
åæã¯Visual Studioç°å¢å ã§ã®ã¿å®è¡ãããŸãããã«ããã€ãã©ã€ã³ããªã¢ãŒãåæã€ã³ãã©ã¹ãã©ã¯ãã£ã«ããããããã¬ã¹å®è¡ã¯ãµããŒããããŠããŸããã - 詳现ãªããŒã¿ãããŒãæ±æåæã¯äžèŠ
CodeRushã¯ããã¹ãèæ ®ããè§£æãããã·ãŒãžã£éã¹ãã£ã³ãé«åºŠãªããŒã¿ãããŒãã¬ãŒã¹ãå®è¡ããŸããããã®ãããè€æ°ã®ãã¡ã€ã«ãã¬ã€ã€ãŒã«ãŸãããè€éãªãã°ãèŠéããŠããŸãå¯èœæ§ããããŸãã - å質管çãããçç£æ§éèŠ
éçºè ã®äººéå·¥åŠã«éç¹ã眮ãããŠãããããæ¬ é¥ã®ç²ŸåºŠãåªå ãã SonarQube ã Coverity ãªã©ã®ããŒã«ã«æ¯ã¹ãŠãã³ãŒãæšæºã®é©çšãããã»ã©å³æ Œã§ã¯ãªãå¯èœæ§ããããŸãã - å€§èŠæš¡ãŸãã¯ã¬ã¬ã·ãŒã³ãŒãããŒã¹ã«ã¯é©ããŠããŸãã
CodeRush ã¯ãå°èŠæš¡ããäžèŠæš¡ã®ãããžã§ã¯ãã§ã¯å¿çæ§ã«åªããŠããŸããã詳现ãªéçãã§ãã¯ãç£æ»ãã³ã³ãã©ã€ã¢ã³ã¹è©äŸ¡ãå¿ èŠãšããå€§èŠæš¡ãªãšã³ã¿ãŒãã©ã€ãº ãªããžããªã§ã¯å¹ççã«æ¡åŒµã§ããªãå¯èœæ§ããããŸãã
CodeRushã¯ãC#åãã®æçãªéçã³ãŒããã£ãŒãããã¯ãšã¹ããŒããªãªãã¡ã¯ã¿ãªã³ã°æ©èœãåããéçºè äžå¿ã®çç£æ§åäžããŒã«ãšããŠåªããŠããŸãããã ããDevSecOpsãå€§èŠæš¡ããŒã ç°å¢ã§äœ¿çšãããŠããæ£åŒãªéçã³ãŒãåæãã©ãããã©ãŒã ã«åã£ãŠä»£ãããã®ã§ã¯ãããŸãããå人ã¬ãã«ã§å³æã®ãã£ãŒãããã¯ãšã¯ãªãŒã³ãªã³ãŒãäœæç¿æ £ãæ±ããããå Žåã¯ãä»ã®ããŒã«ãšçµã¿åããããšå¹æçã§ãã
ã¹ã¿ã€ã«ã³ãã
StyleCopã¯ãMicrosoftã«ãã£ãŠéçºãããéçã³ãŒãåæããŒã«ã§ãïŒãã®åŸãã³ãã¥ããã£ã«ãã£ãŠ ã¹ã¿ã€ã«ã³ããã¢ãã©ã€ã¶ãŒ) ã¯ãC# ã«ãããäžè²«ããã³ãŒãã¹ã¿ã€ã«ãšãã©ãŒãããã®åŒ·åã«ç¹åããããŒã«ã§ããC# ãœãŒã¹ã³ãŒããè§£æããå®çŸ©ãããã¹ã¿ã€ã«ã«ãŒã«ã«æºæ ããŠããããšã確èªããå¯èªæ§ãä¿å®æ§ããããŠããŒã ã®äžè²«æ§ãåäžãããŸãã
StyleCop ã¯ãã»ãã¥ãªãã£äžã®æ¬ é¥ãè€éãªããžã㯠ãšã©ãŒãæ€åºããã®ã§ã¯ãªããæçããåœåèŠåãééãã¬ã€ã¢ãŠããããã¥ã¡ã³ããéèŠããŸãã
åªäœæ§
- ããŒã ãå€§èŠæš¡ãªã³ãŒãããŒã¹å šäœã§äžè²«ããã³ãŒãã£ã³ã°ã¹ã¿ã€ã«ãæšé²ããŸã
- ãã©ãŒããããåœåãé åºãã³ã¡ã³ãã®ããã®å¹ åºãã«ã¹ã¿ãã€ãºå¯èœãªã«ãŒã«ãæäŸããŸã
- Visual Studio ãšçµ±åãããRoslyn ã¢ãã©ã€ã¶ãŒãšäºææ§ããããŸã
- ã³ã³ãã€ã«æã«ã³ãŒãã¹ã¿ã€ã«ã匷å¶ããéçºäžã®åè³ªç¶æã«åœ¹ç«ã¡ãŸãã
- èšå®ãã¡ã€ã«ã远å ã®ã«ãŒã«ã»ãããä»ããŠæ¡åŒµå¯èœ
- ãã«ã ãã€ãã©ã€ã³ãš CI ç°å¢ã«ç°¡åã«çµ±åå¯èœ (NuGet ãŸã㯠MSBuild çµç±)
- ã¯ãªãŒã³ã§èªã¿ããããããææžåãããC#ã³ãŒããæšå¥šããŸã
å¶éãšæ¬ ç¹
StyleCop ã¯æšæºåã«åœ¹ç«ã¡ãŸãããããåºç¯ãªéçåæã®ã³ã³ããã¹ãã§ã¯ãã®åœ±é¿ã匱ããããã€ãã®å¶éããããŸãã
- æ£ç¢ºæ§ãã»ãã¥ãªãã£ã§ã¯ãªããã³ãŒãã¹ã¿ã€ã«ã®ã¿ã«çŠç¹ãåœãŠãŠããŸã
StyleCopã¯ãã°ãããã©ãŒãã³ã¹ã®åé¡ãè匱æ§ãæ€åºãããã®ã§ã¯ãããŸãããRoslynã¢ãã©ã€ã¶ãŒãSonarQubeãªã©ã®ããŒã«ãè£å®ãããã®ã§ããããããã眮ãæãããã®ã§ã¯ãããŸããã - é床ã«å³æ Œã§åé·ã«ãªãããšããã
StyleCopã®ã«ãŒã«ã¯æ°å€ããå€ãã®å Žå峿 Œã§ããé©åãªèšå®ãè¡ããªããšãããŒã ã¯éèŠã§ã¯ãªãã¹ã¿ã€ã«ã®åé¡ã«é¢ããèŠåã«å§åãããéäžåãéåããããã«ãŒã«ç²ããåŒãèµ·ããããããå¯èœæ§ããããŸãã - ææ°ã® C# æ§é ã«å¯Ÿããéå®çãªãµããŒã
StyleCop.Analyzers ã§ã¯ãæ°ãã C# ããŒãžã§ã³ (ã¬ã³ãŒãããã¿ãŒã³ ãããã³ã°ãnull 蚱容åç §åãªã©) ãšã®äºææ§ãåäžããŠããŸããããµããŒããã³ã³ãã€ã©ã®æŽæ°ã«é ããããšããããæ¥éã«é²åãããããžã§ã¯ãã§æ©æŠãçããŠããŸãã - èŠèŠçãªã¬ããŒããææšããªã
SonarQubeãNDependãšã¯ç°ãªããStyleCopã«ã¯ããã·ã¥ããŒãããã£ãŒãããã¬ã³ã远跡æ©èœããããŸãããIDEãŸãã¯ãã«ãåºåã«èŠåã衚瀺ãããã ããªã®ã§ãããŒã å šäœã®å¯èŠæ§ã¯éãããŠããŸãã - ã¢ãŒããã¯ãã£ãè€éãã®åæãªã
StyleCopã¯ãã³ãŒãã®äŸåé¢ä¿ãã¯ã©ã¹æ§é ãä¿å®æ§ææšãåæããŸããã衚é¢çãªäžè²«æ§ã«çŠç¹ãåœãŠãŠãããããæ·±ãèšèšå質ã«ã¯çŠç¹ãåœãŠãŠããŸããã - é©åã«èšå®ãããŠããªãå Žåã¯äŸµå
¥ãããå¯èœæ§ããããŸã
æ¢åã®ãããžã§ã¯ãã§StyleCopãæå¹ã«ãããšããã«ãã«èŠåã倧éã«çºçããå¯èœæ§ããããŸããããŒã ã¯ãç¹ã«å°å ¥æã«ã¯ãé©çšãšå®çšæ§ã®ãã©ã³ã¹ããšãããã«ã«ãŒã«ãæ éã«èª¿æŽããå¿ èŠããããŸãã - ã³ãã¥ããã£ã®ç¶æã«äŸå
ãªãªãžãã«ã®Microsoftãããžã§ã¯ãã¯ã¢ãŒã«ã€ããããŠãããããç¶ç¶çãªéçºã¯ã³ãã¥ããã£ã®è²¢ç®è ã«äŸåããŠããŸããæŽ»çºã§ã¯ãããŸãããé »ç¹ãªã¢ããããŒããšãµããŒãã«äŸåããŠããäŒæ¥ã«ãšã£ãŠã¯ãé·æçãªæç¶å¯èœæ§ã«æžå¿µãçããå¯èœæ§ããããŸãã
StyleCopã¯ãã¯ãªãŒã³ã§æšæºåãããã³ãŒããéèŠããããŒã ã«ãšã£ãŠãäŸç¶ãšããŠè²ŽéãªããŒã«ã§ãããã ããç¹ã«ã»ãã¥ãªãã£ãä¿å®æ§ãããã©ãŒãã³ã¹ãšãã£ãåéã«ãããå æ¬çãªéçã³ãŒãåæã«ã¯ãä»ã®ããŒã«ãšäœµçšããå¿ èŠããããŸãã
FxCop
FxCopã¯ãMicrosoftã.NETãããŒãžãã³ãŒãã察象ã«éçºããåæã®éçè§£æããŒã«ã®äžã€ã§ãããœãŒã¹ã³ãŒãã§ã¯ãªãã³ã³ãã€ã«æžã¿ã¢ã»ã³ããªïŒILã³ãŒãïŒãè§£æããããšã§ãMicrosoftã®.NET Frameworkèšèšã¬ã€ãã©ã€ã³ã«ç §ããåããããã§ãã¯ãå¯èœã§ãããã®åŸãVisual StudioãšMSBuildã«çµ±åãããã³ã³ãã€ã«æã«C#ããã³VB.NETã³ãŒããè§£æããRoslynããŒã¹ã®ã¢ãã©ã€ã¶ãŒçŸ€ã§ããFxCop Analyzersãžãšé²åããŸããã
ãªãªãžãã«ã®ã¹ã¿ã³ãã¢ãã³ FxCop ã¯éæšå¥šãšãªã£ãŠããŸãããFxCop ã¢ãã©ã€ã¶ãŒ ããã±ãŒãžã¯åŒãç¶ãåºã䜿çšãããŠãããææ°ã® .NET éçºã®äžéšãšã㊠.NET SDK ã¢ãã©ã€ã¶ãŒã«å€§éšåãåžåãããŠããŸãã
åªäœæ§
- Microsoft ã«ãã£ãŠæ§ç¯ããã³ä¿å®ãããŠãããVisual Studio ããã³ .NET SDK ãšã®ç·å¯ãªçµ±åãä¿èšŒãããŠããŸãã
- Roslynã䜿çšããŠãã«ãæã«ã³ãŒããåæããé«éã§ãªã¢ã«ã¿ã€ã ã®ãã£ãŒãããã¯ãæäŸããŸãã
- ãã¹ããã©ã¯ãã£ã¹ãåœåèŠåãããã©ãŒãã³ã¹ã®ææ¡ãèšèšã¬ã€ãã©ã€ã³ã®éµå®ã®åŒ·åã«åœ¹ç«ã¡ãŸã
- ã«ãŒã«ã»ãããšãšãã£ã¿ãŒæ§æã«ããã«ãŒã«ã®æå¶ãšã«ã¹ã¿ãã€ãºããµããŒã
- NuGet çµç±ã§ç°¡åã«ã€ã³ã¹ããŒã«ã§ããæ¢åã® .NET Core ãŸã㯠.NET 5+ ãããžã§ã¯ãã«çµ±åã§ããŸãã
- äœ¿çšæ³ãã°ããŒãã«åãä¿¡é Œæ§ãä¿å®æ§ãªã©ãã«ããŒããè±å¯ãªã«ãŒã«ã»ãã
- 掻çºãªéçºã¯çŸåšã .NET ã¢ãã©ã€ã¶ãŒå°æ¥ã®ç¶ç¶æ§ã確ä¿ãã
å¶éãšæ¬ ç¹
FxCop ã¢ãã©ã€ã¶ãŒã¯ .NET èšèšã«ãŒã«ã®é©çšã«åœ¹ç«ã¡ãŸãããããã€ãã®éèŠãªå¶éããããŸãã
- ã»ãã¥ãªãã£éèŠã®åæãªã
FxCopã¯ã詳现ãªã»ãã¥ãªãã£æ¬ é¥ãæ±æè¿œè·¡ãXSSãSQLã€ã³ãžã§ã¯ã·ã§ã³ãªã©ã®äžè¬çãªè匱æ§ãã«ããŒããŠããŸãããã»ãã¥ãªãã£ãä¿èšŒããã«ã¯ã次ã®ãããªããŒã«ãå¿ èŠã§ãã ã³ãŒãQL, ãã©ã³ãŒããŸã㯠èŠå¡å å¿ èŠãšãããŸãã - æ¡åŒµæ§ãéãããŠãã
ã«ã¹ã¿ã ã«ãŒã«ã®äœæã¯å¯èœã§ãããä»ã®ã¢ãã©ã€ã¶ãŒãã¬ãŒã ã¯ãŒã¯ãšæ¯èŒãããšè€éã§ããã«ã¹ã¿ã ããªã·ãŒã®é©çšãæ±ããäŒæ¥ã«ãšã£ãŠãRoslyn Analyzer ã®éçºã¯ããæè»ãªéžæè¢ãšãªããããããŸããã - éæšå¥šã®ã¹ã¿ã³ãã¢ãã³ããŒãžã§ã³
ãªãªãžãã«ã®FxCop GUIãšILã¬ãã«åæããŒã«ã¯ã¡ã³ããã³ã¹ãããªããªããŸãããåŸæ¥ã®ãŠãŒã¶ãŒã¯ãåäœãšã¹ã³ãŒããç°ãªãRoslynããŒã¹ã®ã¢ãã©ã€ã¶ãŒã«ç§»è¡ããå¿ èŠããããŸãã - ã¢ãŒããã¯ãã£ãäŸåé¢ä¿ã®åæçšã«èšèšãããŠããªã
FxCopã¯ã·ã¹ãã ã¢ãŒããã¯ãã£ãã¢ãžã¥ãŒã«ã®äŸåé¢ä¿ãéå±€åãããéåã«é¢ããæ å ±ãæäŸããŸããã NDepend ãããã®æžå¿µã«ã¯ããé©ããŠããŸãã - èŠèŠçãªããã·ã¥ããŒããææšã®æ¬ åŠ
FxCop ã«ã¯ãã¬ããŒãããã¬ã³ã远跡ãããŒã å šäœã®ããã·ã¥ããŒãçšã®ãã€ãã£ã UI ãçšæãããŠããŸããããã£ãŒãããã¯ã¯ IDE 蚺æããã«ãåºåã«äŸåããŠãããããããŒã ããããŒãžã£ãŒã«ãšã£ãŠå¯èŠæ§ãå¶éãããŸãã - .NET SDK ã¢ãã©ã€ã¶ãŒãšã®éè€
æè¿ã®.NETããŒãžã§ã³ã§ã¯ãå€ãã®FxCopã«ãŒã«ãSDKã®çµã¿èŸŒã¿ã¢ãã©ã€ã¶ãŒã«çµ±åãããŠããŸãããã®ãããã«ãŒã«ã»ãããæ éã«ç®¡çããªããšãæ··ä¹±ãéè€ãçããå¯èœæ§ããããŸãã - MSBuild以å€ã®ç°å¢ã«å¯ŸãããµããŒããäžåå
MSBuild ãšã³ã·ã¹ãã å€ã®ãããžã§ã¯ã (Bazel ãã«ã¹ã¿ã ãã«ã ã·ã¹ãã ã®äœ¿çšãªã©) ã§ã¯ãFxCop ã¹ã¿ã€ã«ã®ã«ãŒã«ãçµ±åããéã«æ©æŠãçããŸãã
FxCopïŒçŸåšã®RoslynããŒã¹ã®ããŒãžã§ã³ïŒã¯ãC#ãããžã§ã¯ãåãã®å ç¢ãªMicrosoftãµããŒãä»ãéçè§£æåºç€ã§ãããç¹ã«æšæºçãªã³ãŒãã£ã³ã°ã«ãŒã«ãèšèšã«ãŒã«ã®é©çšãç®æãããŒã ã«ãšã£ãŠæé©ã§ãããã ãããšã³ã¿ãŒãã©ã€ãºã·ããªãªã«ãããŠã¯ãã¢ãŒããã¯ãã£æ€èšŒãã»ãã¥ãªãã£ã¹ãã£ã³ãããžã¥ã¢ã«ã¬ããŒãäœæãªã©ã®è¿œå ããŒã«ãšçµã¿åãããããšã§ããã广çã«æ©èœåŒ·åã§ããŸãã
Fortify éçã³ãŒãã¢ãã©ã€ã¶ãŒ
Fortify SCAã¯ãC#ãå«ãå¹ åºãããã°ã©ãã³ã°èšèªã«ãããã»ãã¥ãªãã£è匱æ§ãšã³ãŒãå質ã®åé¡ãæ€åºããããã«èšèšãããããšã³ã¿ãŒãã©ã€ãºã°ã¬ãŒãã®éçè§£æãã©ãããã©ãŒã ã§ãããœãŒã¹ã³ãŒããèšå®ãã¡ã€ã«ããã«ãã¢ãŒãã£ãã¡ã¯ããã¹ãã£ã³ããéçºã©ã€ããµã€ã¯ã«ã®æ©ã段éã§æœåšçãªãªã¹ã¯ãç¹å®ããŸããFortifyã¯ã峿 Œãªã³ã³ãã©ã€ã¢ã³ã¹ãšã»ãã¥ãªãã£åºæºãåããŠãããããéèãå»çãæ¿åºæ©é¢ãªã©ãèŠå¶ã®å³ããæ¥çã§åºãå©çšãããŠããŸãã
åªäœæ§
- å¹ åºãèšèªãšãã¬ãŒã ã¯ãŒã¯ã®ãµããŒãïŒææ°ã® C# ããã³ .NET ã¢ããªã±ãŒã·ã§ã³ãå®å šã«ã«ããŒïŒ
- ã€ã³ãžã§ã¯ã·ã§ã³è匱æ§ãå®å šã§ãªãæå·åãèªèšŒã®åé¡ãªã©ãå¹ åºãã»ãã¥ãªãã£äžã®æ¬ é¥ãæ€åºããŸãã
- CWEãOWASP Top 10ãSANS 25ãªã©ã®æ¥çæšæºãè匱æ§åé¡ã«çµã¿èŸŒãã§ããŸã
- CI/CD ããŒã«ãIDE (Visual Studio ãªã©)ãDevSecOps ãã€ãã©ã€ã³ãšã®çµ±åãµããŒã
- åªå é äœä»ããããæ¹åã¬ã€ãã³ã¹ãå«ã詳现ãªã¬ããŒã
- ãšã³ã¿ãŒãã©ã€ãºã¬ãã«ã®ã¬ããã³ã¹ã远跡ããªã¹ã¯ç®¡çã®ããã®ãœãããŠã§ã¢ ã»ãã¥ãªã㣠ã»ã³ã¿ãŒ (SSC) ãæäŸããŸã
- ãã¡ã€ã³åºæã®ããªã·ãŒã®ã«ã¹ã¿ã ã«ãŒã«ããã¯ãšæ§æããµããŒã
- é·å¹Žã®ã»ãã¥ãªãã£ç ç©¶ããŒã ãšå®æçãªã«ãŒã«ããã¯ã®ã¢ããããŒãã«æ¯ããããŠããŸã
- ã¯ã©ãŠããã€ãã£ããšã¬ã¬ã·ãŒ .NET ã¢ããªã±ãŒã·ã§ã³ã®äž¡æ¹ã®ãµããŒããå«ãŸããŠããŸã
å¶éãšæ¬ ç¹
Fortify SCA ã¯åŒ·åã§ããããã®è€éããšãšã³ã¿ãŒãã©ã€ãºãžã®éç¹ã«ãããæ¬¡ã®ãããªãã¬ãŒããªãã䌎ããŸãã
- é«ãåŠç¿æ²ç·
Fortifyã®ã»ããã¢ãããæ§æããã¥ãŒãã³ã°ã¯è€éã«ãªãå ŽåããããŸãã广çãªå°å ¥ã«ã¯ãå°ä»»ã®ã»ãã¥ãªãã£ãšã³ãžãã¢ãã³ã³ãµã«ã¿ã³ããå¿ èŠã«ãªãå Žåãå€ããããŸãã - å€§èŠæš¡ã³ãŒãããŒã¹ãžã®ããã©ãŒãã³ã¹ã®åœ±é¿
ãã«ã¹ãã£ã³ã¯ãç¹ã«å€§èŠæš¡ã¢ããªã±ãŒã·ã§ã³ãã¢ããªã·ãã¯ã¢ããªã±ãŒã·ã§ã³ã§ã¯æéããããå ŽåããããŸããå¢åã¹ãã£ã³ãéšåã¹ãã£ã³ãå©çšå¯èœã§ãããæ éãªèª¿æŽãå¿ èŠã§ãã - é«äŸ¡ãªã©ã€ã»ã³ã¹
Fortifyã¯åžå Žã§æãé«äŸ¡ãªãœãªã¥ãŒã·ã§ã³ã®äžã€ã§ãããå°èŠæš¡ãŸãã¯äžèŠæš¡ã®ããŒã ã«ã¯æãå±ããªãäŸ¡æ Œèšå®ãšãªã£ãŠããå Žåãå€ãã§ããã©ã€ã»ã³ã¹ã¯éåžžãã¢ããªã±ãŒã·ã§ã³ã®ãµã€ãºãšãŠãŒã¶ãŒæ°ã«å¿ããŠéå±€åãããŠããŸãã - éçºè
åãã®æ¥éãªãªã³ããŒãã£ã³ã°
ã»ãã¥ãªãã£ã®æŠå¿µã«éŠŽæã¿ã®ãªãéçºè ã«ãšã£ãŠãFortify ã®è©³çްãªã¬ããŒãã¯é£è§£ã§è§£éãé£ãããšæãããããããŸãããIDE ãšã®çµ±åã¯åœ¹ç«ã¡ãŸããããã¬ãŒãã³ã°ãåããŠããªããšã³ã³ããã¹ããäžè¶³ããããšããããŸãã - ã«ãŒã«ããã¯ã®èª¿æŽãå¿
èŠ
ããã«äœ¿ããã«ãŒã«ã§ã¯ã倧éã®èŠåã誀æ€ç¥ãçºçããå¯èœæ§ããããŸããå®çšçãªçµæãåŸãã«ã¯ãããŒã ã¯ãããžã§ã¯ãåºæã®ã³ã³ããã¹ãã«åãããŠã«ãŒã«ã調æŽããããã«æéãè²»ããå¿ èŠããããŸãã - ã¢ãŒããã¯ãã£ãã³ãŒãå質ã«é¢ããæŽå¯ãéãããŠãã
Fortifyã¯ã»ãã¥ãªãã£ã¹ãã£ã³ã«åªããŠããŸããããœãããŠã§ã¢ã®ä¿å®æ§ãã³ãŒãã®è€éããã¢ãŒããã¯ãã£ã®é©åæ§ã«é¢ããå¯èŠæ§ã¯éå®çã§ããå šäœçãªèŠç¹ãåŸãã«ã¯ãè£å®çãªããŒã«ãå¿ èŠã«ãªãããšããããããŸãã - ãã«ãçµ±åã®èª²é¡
éæšæºã®ãã«ãç°å¢ãŸãã¯ã«ã¹ã¿ã ãã€ãã©ã€ã³ã§ã¯ãFortify ã¹ãã£ã³ã CI/CD ã¯ãŒã¯ãããŒã«å®å šã«çµ±åããããã«è¿œå ã®äœæ¥ãå¿ èŠã«ãªãå ŽåããããŸãã
Fortifyã¯ãæçããã»ãã¥ãªãã£ãã©ã¯ãã£ã¹ãèŠå¶ã®å³ããç°å¢ããããŠè©³çްãªè匱æ§ã¹ãã£ã³ãšäžå çãªãªã¹ã¯ã¬ããã³ã¹ãå¿ èŠãšããè€éãªC#ã¢ããªã±ãŒã·ã§ã³ãåããçµç¹ã«æé©ã§ãã培åºçãªæ·±åºŠãããã¹ããŒããšäœ¿ãããããéèŠããå°èŠæš¡ãªããŒã ããããžã§ã¯ãã§ã¯ã軜éãªããŒã«ã®æ¹ãã³ã¹ãããã©ãŒãã³ã¹ã«åªããŠããå ŽåããããŸãã
ãã§ãã¯ããŒã¯
Checkmarxã¯ãçµç¹ãéçºã©ã€ããµã€ã¯ã«ã®æ©ææ®µéã§ãœãŒã¹ã³ãŒãå ã®ã»ãã¥ãªãã£è匱æ§ãç¹å®ããä¿®æ£ããã®ã«åœ¹ç«ã€ãæ¥çããªãŒããããšã³ã¿ãŒãã©ã€ãºSASTãã©ãããã©ãŒã ã§ããå¹ åºãèšèªãšãã¬ãŒã ã¯ãŒã¯ããµããŒãããC#ããã³.NETç°å¢ïŒASP.NETãBlazorãã¬ã¬ã·ãŒ.NET Frameworkã¢ããªãå«ãïŒã®è©³çްãªåææ©èœãåããŠããŸããææ°ã®DevSecOpsã¯ãŒã¯ãããŒãžã®çµ±åã念é ã«èšèšãããŠãããéèãå»çãé²è¡ãªã©ã®åéã§åºãæ¡çšãããŠããŸãã
åªäœæ§
- å®å šãªæ§æãã»ãã³ãã£ã¯ã¹ããããŒè§£æãå«ããC# ããã³ .NET ããŒã¹ã®ãããžã§ã¯ããå æ¬çã«ãµããŒã
- SQLã€ã³ãžã§ã¯ã·ã§ã³ãã¯ãã¹ãµã€ãã¹ã¯ãªããã£ã³ã°ãããŒãã³ãŒããããã·ãŒã¯ã¬ãããå®å šã§ãªããã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ãèªèšŒã®æ¬ é¥ãªã©ã®è匱æ§ã广çã«æ€åºããŸãã
- ããŒã¿ãããŒãšå¶åŸ¡ãããŒã®ã¢ããªã³ã°ã掻çšããŠãã³ã³ããã¹ãã«å¿ããè匱æ§ã®è¿œè·¡ãæäŸããŸãã
- Visual StudioãAzure DevOpsãGitHubãGitLabãJenkins ãªã©ãšçµ±å
- ã«ã¹ã¿ãã€ãºå¯èœãªã¹ãã£ã³ ããªã·ãŒãšã³ã³ãã©ã€ã¢ã³ã¹ ãããã³ã° (äŸ: OWASP Top 10ãPCI DSSãHIPAAãGDPR)
- éçºè ãåé¡ãããæ©ã解決ã§ããããã«ãäŸãå«ã修埩ã¬ã€ãã³ã¹ãå«ãŸããŠããŸã
- ãªã¹ã¯ç®¡çãã³ã³ãã©ã€ã¢ã³ã¹ãç£æ»æºåã®ããã®éäžããã·ã¥ããŒããšã¬ããŒã
- ãªã³ãã¬ãã¹å±éã ãã§ãªãã管çãããã¯ã©ãŠãããŒã¹ã®ã¹ãã£ã³ãµãŒãã¹ïŒCheckmarx OneïŒãæäŸããŸãã
- ãœãããŠã§ã¢æ§æåæ (SCA) ããã³ã€ã³ãã©ã¹ãã©ã¯ãã£ã»ã¢ãºã»ã³ãŒã (IaC) ããŒã«ãšã®çµ±åããµããŒã
å¶éãšæ¬ ç¹
ãšã³ã¿ãŒãã©ã€ãºåãã®åŒ·ã¿ãããã«ãããããããCheckmarx ã«ã¯ C# ã§äœæ¥ããããŒã ã«ç¹ã«é¢ä¿ããããã€ãã®æ³šæç¹ããããŸãã
- ãªãœãŒã¹ã倧éã«æ¶è²»ããã»ããã¢ãããè€é
ã«ãŒã«ã®èª¿æŽãCIã®çµ±åãå«ãåæèšå®ã«ã¯æéããããå ŽåããããŸãã广çãªå°å ¥ã«ã¯ããªã³ããŒãã£ã³ã°æ¯æŽããã³ããŒã®ãµããŒããå¿ èŠã«ãªãããšããããããŸãã - ã¬ã¬ã·ãŒ C# ã³ãŒãããŒã¹ã«ããã誀æ€ç¥
å€ãã³ãŒã ãã¿ãŒã³ãéæšæºã®ã³ãŒã ãã¿ãŒã³ (åçãªãã¬ã¯ã·ã§ã³ã ADO.NET ãªã©) ã§ã¯ãã¹ãã£ã³ ã«ãŒã«ãã«ã¹ã¿ãã€ãºããªãéãã誀æ€ç¥çãé«ããªãå¯èœæ§ããããŸãã - éãããã¢ãŒããã¯ãã£/ã³ãŒãå質ã¡ããªã¯ã¹
Checkmarxã¯ã»ãã¥ãªãã£è匱æ§ã®æ€åºã«ã¯åªããŠããŸãããä¿å®æ§ãã¢ãžã¥ãŒã«æ§ãã¯ãªãŒã³ã¢ãŒããã¯ãã£ååã®éµå®ç¶æ³ã«é¢ããæŽå¯ã¯éå®çã§ããå質管çã«ã¯ãNDependãReSharperã®ãããªããŒã«ãäŸç¶ãšããŠå¿ èŠã§ãã - é«ã³ã¹ããšäŒæ¥äžå¿
ã©ã€ã»ã³ã¹ã³ã¹ãã¯é«é¡ã§ãããå°èŠæš¡ãªããŒã ãã¹ã¿ãŒãã¢ããäŒæ¥ã§ã¯æ¡åŒµæ§ã«æ¬ ããå¯èœæ§ããããŸãããã®ãã©ãããã©ãŒã ã¯ãäž»ã«å€§èŠæš¡ãªéçºç°å¢ãã»ãã¥ãªãã£ãéèŠããäŒæ¥åãã«èšèšãããŠããŸãã - å€§èŠæš¡ C# ãããžã§ã¯ãã®ã¹ãã£ã³æé
ãã£ãŒãã¹ãã£ã³ã®ç²ŸåºŠã¯åŠçæéãå¢å ãããŸããã¢ããªã·ãã¯ãŸãã¯å¯çµåãããã³ãŒãããŒã¹ã§ã¯ãæé©åãè¡ããªããšã¹ãã£ã³ã«ãã£ãŠãã€ãã©ã€ã³ã®é床ãäœäžããå¯èœæ§ããããŸãã - äžéšã®.NETåºæã®ã¯ãŒã¯ãããŒãšã®æ·±ãçµ±åã¯ãããŸãã
Microsoft ãã€ãã£ã ããŒã«ãšæ¯èŒãããšãã¢ãã©ã€ã¶ãŒãnull 蚱容åç §åãã©ã³ã¿ã€ã åºæã®æ§æãªã©ã®æ©èœãšã®çµ±åã¯æ·±ã¿ã«æ¬ ããå¯èœæ§ããããŸãã - éçºè
ã®åŠç¿æ²ç·
å®å šãªã³ãŒãã£ã³ã°ãé«åºŠãªè匱æ§ã®çš®é¡ã«ç²ŸéããŠããªãéçºè ã¯ãã¬ã€ãã³ã¹ããã¬ãŒãã³ã°ãªãã§ã¯ã¬ããŒãåºåãè§£éããããšãé£ããå ŽåããããŸãã
Checkmarxã¯ãéçºãã€ãã©ã€ã³å šäœã«ãããå ç¢ã§èªååãããèåŒ±æ§æ€åºãå¿ èŠãšãããšã³ã¿ãŒãã©ã€ãºã°ã¬ãŒãã®.NET/C#ã¢ããªã±ãŒã·ã§ã³ã«æé©ã§ããæ·±åºŠãšå¶åŸ¡ã®ç¹ã§åŒ·åã§ããã軜éãŸãã¯ãªã¢ã«ã¿ã€ã ã®éçã³ãŒããã£ãŒãããã¯ãå¿ èŠãšããããŒã ã«ãšã£ãŠã¯ãéå°æ©èœãŸãã¯ãªãœãŒã¹ã倧éã«æ¶è²»ããå¯èœæ§ããããŸãã
Veracode éçè§£æ
Veracodeã¯ããªã³ããŒãã£ã³ã°ã®å®¹æããšãšã³ã¿ãŒãã©ã€ãºã¬ããã³ã¹ã®å®¹æãã§ç¥ããããã¯ã©ãŠããã€ãã£ãã®éçã¢ããªã±ãŒã·ã§ã³ã»ãã¥ãªãã£ãã¹ãïŒSASTïŒãã©ãããã©ãŒã ãæäŸããŠããŸããéè¡ãå»çãä¿éºãªã©ã峿 Œãªã³ã³ãã©ã€ã¢ã³ã¹èŠä»¶ãæ±ããããæ¥çã§åºãå©çšãããŠããŸããC#éçºè ãš.NETããŒã åãã«ãVeracodeã¯ASP.NET CoreãBlazorãã¬ã¬ã·ãŒ.NET Frameworkãããžã§ã¯ããå«ããWebã¢ããªã±ãŒã·ã§ã³ãšãã¹ã¯ãããã¢ããªã±ãŒã·ã§ã³ã®äž¡æ¹ã®åæããµããŒãããŠããŸãã
åªäœæ§
- .NET Core ããã³ .NET 6+ ãå«ããææ°ããã³ã¬ã¬ã·ãŒã® C# ã³ãŒãããŒã¹ãå®å šã«ãµããŒã
- ã€ã³ãžã§ã¯ã·ã§ã³ãæå·ã®æ¬ é¥ãå®å šã§ãªãAPIãããžãã¹ããžãã¯ã®åé¡ãªã©ãããŸããŸãªè匱æ§ãæ€åºããŸãã
- å®å šã«ã¯ã©ãŠãããŒã¹ã®ã¢ãŒããã¯ãã£ã®ãããããŒã«ã«ã€ã³ãã©ã¹ãã©ã¯ãã£ã¯äžèŠã§ã
- äºåã³ã³ãã€ã«ããããã€ã㪠(DLLãEXE ãªã©) ã䜿çšããã·ã³ãã«ãªã¢ããããŒã ã¢ã³ã ã¹ãã£ã³ ã¢ãã«
- OWASP Top 10ãCWEãSANS 25ãããã³æ¥çåºæã®èŠå¶ã«æºæ
- å®å šãªã³ãŒãã£ã³ã°ãã©ã¯ãã£ã¹ãèªåçã«é©çšããããªã·ãŒäž»å°ã®éçºããµããŒãããŸãã
- Visual StudioãAzure DevOpsãJenkinsãGitHubãGitLabããã®ä»ã®CI/CDãã©ãããã©ãŒã ãšçµ±åããŸã
- æç¢ºãªä¿®åŸ©ã¬ã€ãã³ã¹ãCWE ãªã³ã¯ãä¿®æ£æšå¥šäºé ãæäŸããŸã
- ã³ã³ãã©ã€ã¢ã³ã¹ãšç£æ»ã®è¿œè·¡ã®ããã®åæããã·ã¥ããŒããšéäžåãªã¹ã¯ã¬ããŒããæäŸããŸã
- ã»ãã¥ãªãã£ç ç©¶ãšå®æçãªã«ãŒã«ããã¯ã®ã¢ããããŒãã«ãã£ãŠæ¯ããããŠããŸã
å¶éãšæ¬ ç¹
Veracode 㯠C# ã«åŒ·åãªã»ãã¥ãªãã£åæãæäŸããŸãããã¢ãŒããã¯ãã£äžããã³å®çšäžã®ãã¬ãŒããªãã䌎ããŸãã
- ããªã³ã³ãã€ã«ããããã€ããªã¹ãã£ã³ã¯ãœãŒã¹ã¬ãã«ã®ã³ã³ããã¹ããå¶éãã
Veracodeã¯ã³ã³ãã€ã«ãããã³ãŒãäžã§åäœãããããã³ã¡ã³ãã¢ãŠããããå®å šã§ãªãã³ãŒããã³ãŒãã³ã¡ã³ãããã现ããå¶åŸ¡ãããŒæ¡ä»¶ãªã©ãéçºæã®æ§æèŠçŽ ã®äžéšã¯å¯èŠåãããŸãããéçºè ã¯ã¢ããªãã¢ããããŒãããåã«ã³ã³ãã€ã«ããå¿ èŠããããŸãã - ãªã¢ã«ã¿ã€ã ã®IDEããŒã¹ã®ãã£ãŒãããã¯ã¯ãµããŒããããŠããªã
Roslyn AnalyzersãReSharperãªã©ã®ããŒã«ãšã¯ç°ãªããVeracodeã¯éçºäžã«ã€ã³ã©ã€ã³ãŸãã¯ã€ã³ã¿ã©ã¯ãã£ããªèŠåãæäŸããŸãããè匱æ§ã¯ãã€ããªããã«ãããã¢ããããŒããããåŸã«ã®ã¿æããã«ãªããŸãã - CI/CD ã«ããããã£ãŒããã㯠ã«ãŒãã®é
å»¶
å€ãã®ãã€ãã©ã€ã³ãšçµ±åãããŠããŸããããã€ããªãã¢ããããŒãããŠåæçµæãåŸ ã€ããã»ã¹ã«ãããè¿ éãªã€ãã¬ãŒã·ã§ã³ããã¹ãé§ååã¯ãŒã¯ãããŒã®é床ãäœäžããå¯èœæ§ããããŸãããã¥ãŒãã³ã°ãªãã§ã¿ã€ããªéçºãµã€ã¯ã«ãå®è¡ããã«ã¯é©ããŠããŸããã - éçã³ãŒãã®å質ãã¹ã¿ã€ã«ã®åŒ·å¶ãå¶éãããŠãã
Veracodeã¯ãäžè¬çãªã³ãŒãå質ãã¢ãŒããã¯ãã£æ€èšŒããã©ãŒãããã§ã¯ãªããã»ãã¥ãªãã£äžã®æ¬ é¥ã«éç¹ã眮ããŠããŸããå®å šãªã«ãã¬ããžãåŸãã«ã¯ãStyleCopãNDependãESLintãªã©ã®ããŒã«ãšçµã¿åãããå¿ èŠãããå Žåãå€ããããŸãã - ãšã³ã¿ãŒãã©ã€ãºã¬ãã«ã®äŸ¡æ Œèšå®
äžè¬çã«ãå°èŠæš¡ãªããŒã ã«ãšã£ãŠã¯ã³ã¹ããé«ãããŸãããã®ãã©ãããã©ãŒã ã¯ãã»ãã¥ãªãã£éèŠã®éçºããµããŒãããããã®äºç®ãšããã»ã¹ãåããäžèŠæš¡ããå€§èŠæš¡ã®äŒæ¥åãã«äœçœ®ä»ããããŠããŸãã - ã«ãŒã«ã®ã«ã¹ã¿ãã€ãºã®æ¬ åŠ
ãªãŒãã³ãœãŒã¹ãŸãã¯ããŒã«ã«ã§ãã¹ããããããŒã«ãšæ¯èŒãããšãVeracode ã§ã¯ãç¬èªã®ã³ãŒãã£ã³ã° ãã¿ãŒã³ãããã㪠C# API ã®æ°ããæ€åºã«ãŒã«ãã«ã¹ã¿ãã€ãºãããäœæãããããæ©èœãå¶éãããŠããŸãã
Veracodeã¯ãã¬ããã³ã¹ãšç£æ»æ©èœãåããã¯ã©ãŠãããŒã¹ã§ããã©ã«ãã§å®å šãªéçè§£æã¢ãããŒããæ±ããçµç¹ã«ãšã£ãŠãå å®ãªãœãªã¥ãŒã·ã§ã³ã§ããããããéçºè ããã®å³æãã£ãŒãããã¯ããœãŒã¹ã¬ãã«ã®ç®¡çãå¿ èŠãšããããŒã ã«ãšã£ãŠã¯ãIDEçµ±ååããªãŒãã³ãœãŒã¹ã®ä»£æ¿ææ®µã«æ¯ã¹ãŠããã©ãããã©ãŒã ã®å¿çæ§ãäœããšæãããããããŸããã
ã¯ããã¯ã¯ãŒã¯
Perforce瀟ãéçºããKlocworkã¯ãé«ä¿¡é Œæ§ãœãããŠã§ã¢éçºåãã«èšèšãããéçã¢ããªã±ãŒã·ã§ã³ã»ãã¥ãªãã£ãã¹ãïŒSASTïŒããŒã«ã§ããC#ãC++ãJavaãPythonãJavaScriptãªã©ãå¹ åºãèšèªããµããŒãããŠãããèªåè»ãèªç©ºå®å®ãé²è¡ãå»çãšãã£ãèŠå¶ãå³ãããå®å šæ§ãéèŠãããæ¥çã§åºãå©çšãããŠããŸãã
C# ããŒã ã«ãšã£ãŠãKlocwork ã¯éçºãµã€ã¯ã«ã®æ©ã段éã§ã»ãã¥ãªãã£ã®è匱æ§ãã³ãŒãã®æ¬ é¥ãä¿å®æ§ã®åé¡ãæ€åºãã匷åãªæ¹æ³ãæäŸããŸãã
åªäœæ§
- ææ°ã® C# æšæºããµããŒãããVisual Studio ããã³ MSBuild ãšã®çµ±åãå®çŸããŸãã
- ãããã¡ãªãŒããŒãããŒããã«åç §äŸå€ãã€ã³ãžã§ã¯ã·ã§ã³è匱æ§ãåæå®è¡åé¡ãè«çæ¬ é¥ãæ€åºããŸãã
- ïœã«éç¹ã眮ã ã»ãã¥ãªãã£ã³ã³ãã©ã€ã¢ã³ã¹OWASP Top 10ãCWEãMISRAãCERTæšæºã®çµã¿èŸŒã¿ã«ãŒã«ã»ãããæäŸããŸãã
- æäŸ å¢ååæ ã³ãŒãã®å€æŽæã«ãžã£ã¹ãã€ã³ã¿ã€ã ã®ãã£ãŒãããã¯ãæäŸãããååž°ãé²ãã®ã«åœ¹ç«ã¡ãŸãã
- ããã©ãŒãã³ã¹ãäœäžãããããšãªããå€§èŠæš¡ã§è€é㪠C# ã³ãŒãããŒã¹ãšäºææ§ããããŸã
- JenkinsãGitHub ActionsãAzure DevOps ãªã©ã® CI/CD ãã€ãã©ã€ã³ãšçµ±åããŸã
- ãªãã¡ãŒ æ¬ é¥ãããŒã®è¿œè·¡å¯èœæ§ æ ¹æ¬åå ãçè§£ããããã®è©³çްãªèšºæ
- éçºè åãã®ãã¹ã¯ããããã©ã°ã€ã³ãšããããŒãžã£ãŒããã³QAåãã®ãµãŒããŒããŒã¹ã®ã¬ããŒãæ©èœãå«ãŸããŠããŸã
- ã¢ããªã·ãã¯ãŸãã¯ãã€ã¯ããµãŒãã¹ããŒã¹ã®ã·ã¹ãã ã§äœæ¥ãã忣ããŒã åãã«ã¹ã±ãŒã©ãã«
- DevSecOpsãšAgileç°å¢ã§ã»ãã¥ãªãã£éèŠã®éçºãå¯èœã«ããŸã
å¶éãšæ¬ ç¹
Klocwork ã¯ãšã³ã¿ãŒãã©ã€ãºå¯Ÿå¿ã§ãããç¹ã«å°èŠæš¡ãªéçºããŒã ãèŠå¶ã®å°ãªãéçºããŒã ã«ãšã£ãŠã¯ãå°å ¥ã䜿ããããã劚ããå¯èœæ§ã®ãã課é¡ãé åãããã€ããããŸãã
- è€éãªæ§æãšæ¥å³»ãªåŠç¿æ²ç·
åæã«ãŒã«ã®åæèšå®ãšåŸ®èª¿æŽã«ã¯ãããªãã®æéãšå°éç¥èãå¿ èŠã«ãªãå ŽåããããŸããããŒã ã¯ãã¬ãŒãã³ã°ã«æéãå²ããããå°ä»»ã®ã»ãã¥ãªãã£ãšã³ãžãã¢ãéçšãããããå¿ èŠãããããšããããããŸãã - 軜éåæè£
çœ®ã«æ¯ã¹ãŠèšçœ®é¢ç©ã倧ãã
Klocwork ã¯ãRoslyn ã StyleCop ãªã©ã®ã·ã³ãã«ãªããŒã«ãããå€ãã®ãªãœãŒã¹ãæ¶è²»ãããããã¹ããã¯ã®äœããã·ã³ã§ã¯ CI ãã€ãã©ã€ã³ãéçºç°å¢ã®é床ãäœäžããå¯èœæ§ããããŸãã - ããã©ã«ãã§ã¯éçºè
åãã§ã¯ãªã
ãã©ã°ã€ã³ã¯å©çšå¯èœã§ãããéçºè ã¯ææ°ã®IDEçµ±åããŒã«ã«æ¯ã¹ãŠUXãçŽæçã§ã¯ãªããšæãããããããŸãããäžéšã®çµæã®è§£éã«ã¯ãäžçŽã¬ãã«ã®å°éç¥èãå¿ èŠã«ãªãå ŽåããããŸãã - é«ã³ã¹ããšäŒæ¥ã®äœçœ®ä»ã
ã©ã€ã»ã³ã¹äŸ¡æ Œã¯äžèŠæš¡ããå€§èŠæš¡ã®çµç¹åãã§ããå°èŠæš¡ãªããŒã ããªãŒãã³ãœãŒã¹ãããžã§ã¯ãã«ã¯æãå±ããªãå¯èœæ§ããããŸãã - ãªãŒãã³ãœãŒã¹ã³ãã¥ããã£ãšæ¡åŒµæ§ãéãããŠãã
ã³ãã¥ãã㣠ãšã³ã·ã¹ãã (ESLintãRoslyn ãªã©) ã«æ¯ããããã¢ãã©ã€ã¶ãŒãšã¯ç°ãªããKlocwork ã¯ç¬èªã®ãã®ã§ããããã³ããŒã®ãµããŒããªãã§ã¯æ¡åŒµãã«ã¹ã¿ã ã«ãŒã«ã®äœæãè¡ãæè»æ§ãäœããªããŸãã - UIãšã¬ããŒããšã¯ã¹ããªãšã³ã¹
åé¡ã®å ±åãšããªã¢ãŒãžã®ããã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã¯æ©èœçã§ãããæä»£é ãã§ããäžéšã®ããŒã ããã¯ã倿°ã®çºèŠäºé ã«é¢ããŠãŠãŒã¶ããªãã£ã®åé¡ãå ±åãããŠããŸãã
Klocworkã¯ãã³ã³ãã©ã€ã¢ã³ã¹ãã»ãã¥ã¢ãªã³ãŒãããããŠæ£åŒãªäžå ·åè¿œè·¡ãæ±ãããããšã³ã¿ãŒãã©ã€ãºãŸãã¯ããã·ã§ã³ã¯ãªãã£ã«ã«ãªC#éçºç°å¢ã«æé©ã§ããããããè¿ éã§éçºè ã«ãšã£ãŠäœ¿ãããããã£ãŒãããã¯ãšããŒã«ã®æè»æ§ãæ±ããå°èŠæš¡ãªã¢ãžã£ã€ã«ããŒã ãçµç¹ã«ã¯é©ããªãå¯èœæ§ããããŸãã
ã»ã ã°ã¬ãã
Semgrepã¯ãr2cïŒReturnToCorpïŒãéçºãããªãŒãã³ãœãŒã¹ã®éçè§£æããŒã«ã§ããC#ãå«ãå€ãã®èšèªã«å¯Ÿå¿ããã·ã³ãã«ããé«éæ§ããããŠã«ãŒã«ããŒã¹ã®ã¹ãã£ã³æ©èœãéèŠããŠããŸãããã¿ãŒã³ãããã³ã°æ©èœãšãã«ã¹ã¿ãã€ãºå¯èœãªã«ãŒã«ã§ã»ãã¥ãªãã£åé¡ãšã³ãŒãå質ã®åé¡ã®äž¡æ¹ãæ€åºã§ãããããã»ãã¥ãªãã£ãšã³ãžãã¢ãDevSecOpsããŒã ã®éã§ç¹ã«äººæ°ããããŸãã
Semgrep ã¯ãã³ãã¥ããã£å±€ãšåçšå±€ã®äž¡æ¹ã§ C# ããµããŒãããã¯ã©ãŠãããã³ã»ã«ããã¹ãåã®å±éã¢ãã«ãæäŸããŸãã
åªäœæ§
- ææ°ã® C# æ§æããµããŒããã軜éã§é«é㪠CLI ããŒã¹ã®ã¢ãã©ã€ã¶ãŒ
- æžããããçè§£ãããã YAML ããŒã¹ã®ã«ãŒã«ã«ãããçµç¹ã®ã³ãŒãã£ã³ã° ãã©ã¯ãã£ã¹ã«åºæã®ã«ã¹ã¿ã ãã¿ãŒã³ãå¯èœã«ãªããŸãã
- GitHub ActionsãGitLab CIãAzure DevOps ãªã©ãšã®é«éå®è¡ãš CI/CD çµ±åã«ãããDevSecOps ãã€ãã©ã€ã³ã«æé©ã§ãã
- ã»ãã¥ãªãã£ãä¿å®æ§ãããã©ãŒãã³ã¹ã®ããã®çµã¿èŸŒã¿ã«ãŒã« ã©ã€ãã©ãª (OWASP Top 10ãSANS 25 ãªã©ãå«ã)
- ã»ãã¥ãªãã£ã®ã·ããã¬ãããããŒãžãå±éåã®å顿€åºã匷åã«ãµããŒã
- å ±æã³ãŒãããŒã¹å šäœã§å®å šãªãã¿ãŒã³ãšãã¹ããã©ã¯ãã£ã¹ãé©çšããã®ã«é©ããŠããŸã
- ã¯ã©ãŠã ãã©ãããã©ãŒã (Semgrep Cloud Platform) ã«ã¯ãããã·ã¥ããŒããPR ã³ã¡ã³ããç£æ»ãã°ãããŒã ããŒã¹ã®ã«ãŒã«é©çšãå«ãŸããŸãã
- Semgrep Supply Chain ããã³ Semgrep Secrets ã«ããæ¡åŒµãå¯èœã§ãããæ·±ãã¢ããªã±ãŒã·ã§ã³ ã»ãã¥ãªãã£ã®é©çšç¯å²ãå®çŸããŸãã
- 掻æ°ã®ããã³ãã¥ããã£ãšåžžã«æé·ãããªãŒãã³ã«ãŒã«ã¬ãžã¹ããª
- å¯å€§ãªå¶éãšå°èŠæš¡ããŒã ã«ãšã£ãŠåå ¥éå£ã®ãªãç¡æå±€ãå©çšå¯èœ
å¶éãšæ¬ ç¹
æè»æ§ãšé床ã«ãããããããSemgrep ã C# ã³ãŒãã«é©çšããå Žåãç¹ã«è©³çްãªéçåæã¿ã¹ã¯ã§ã¯é¡èãªå¶éããããŸãã
- C#ã®éšåçãªèšèªãµããŒã
JavaScriptãPythonãGo ã«å¯ŸããæçãããµããŒããšæ¯èŒãããšãSemgrep ã® C# ãµããŒãã¯ãŸã éçºæ®µéã«ãããŸããLINQãasync/await ãããŒããžã§ããªãã¯ãè€éãªåŒããªãŒãšãã£ãé«åºŠãª C# æ©èœãå®å šã«è§£æãŸãã¯çè§£ã§ããªãå¯èœæ§ããããŸãã - 詳现ãªããŒã¿ãããŒåæãªã
Semgrepã¯æ§æããã³æå³ã®ãããã³ã°ã«åªããŠããŸãããCoverityãKlocworkãCodeQLãªã©ã®ããŒã«ãæäŸããé«åºŠãªå¶åŸ¡ãããŒããã³æ±æåææ©èœã¯åããŠããŸããããã®ãããè€æ°ã®ãã¡ã€ã«ãã¡ãœããåŒã³åºãã«ãŸãããè匱æ§ã®æ€åºèœåãå¶éãããå¯èœæ§ããããŸãã - éå®çãªIDEçµ±å
RoslynããŒã¹ã®ã¢ãã©ã€ã¶ãŒãReSharperãšã¯ç°ãªããSemgrepã¯Visual StudioãRiderå ã§ããã©ã«ãã§ã€ã³ã©ã€ã³èšºæãæäŸããŸãããéçºè ã¯ãã«ã¹ã¿ã çµ±åãäœæããªãéããCIããã®ãã£ãŒãããã¯ã«é Œãããæåã¹ãã£ã³ããŒã«ãšããŠäœ¿çšããå¿ èŠããããŸãã - èŠèŠåã建ç¯åæã¯è¡ãããªã
ãšã³ã¿ãŒãã©ã€ãº ããŒã ã§é »ç¹ã«å¿ èŠãšãããäŸåé¢ä¿ã°ã©ããã³ãŒã ã¡ããªãã¯ãã¢ãŒããã¯ãã£æ€èšŒæ©èœã¯ãµããŒããããŠããŸããã - ã«ãŒã«äœæã®åŠç¿æ²ç·ãæ¥å³»
åºæ¬çãªã«ãŒã«ã¯ç°¡åã«èšè¿°ã§ããŸãããå€§èŠæš¡ãª C# ã³ãŒãããŒã¹ã«å¯ŸããŠä¿¡é Œæ§ãé«ããã€ãºã®ãªããã¿ãŒã³ãäœæããã«ã¯ãSemgrep ã®æœè±¡æ§æããªãŒæ§é ãšèšèªå éšã®è©³çްãªç¥èãå¿ èŠã«ãªãå ŽåããããŸãã - äžè¬çãªå質匷åãããã»ãã¥ãªãã£ã¯ãŒã¯ãããŒã§å¹æç
Semgrepã®åŒ·ã¿ã¯ãã»ãã¥ãªãã£ã¹ãã£ã³ãšããªã·ãŒã³ã³ãã©ã€ã¢ã³ã¹ã«ãããŸããã¹ã¿ã€ã«èŠåã®é©çšã埪ç°çè€é床ã®ãã§ãã¯ã«é¢ããŠã¯ãNDependãStyleCopã®ãããªããŒã«ã»ã©å å®ããæ©èœãåããŠããŸããã
Semgrepã¯ãDevSecOpsãã©ã¯ãã£ã¹ãå°å ¥ããã«ã¹ã¿ãã€ãºå¯èœã§é«éãã€å調çãªã¹ãã£ã³ãå¿ èŠãšããçŸä»£ã®ããŒã ã«ãšã£ãŠæé©ãªéžæè¢ã§ããC#éçºã«ãããŠã¯ããã£ãŒãã¢ãã©ã€ã¶ãŒãIDEãã€ãã£ããœãªã¥ãŒã·ã§ã³ã®å®å šãªä»£æ¿åãšããŠã§ã¯ãªãããã«ãããŒã«æŠç¥ã®äžéšãšããŠäœ¿çšããã®ãæé©ã§ãã
ã³ãŒãQL
GitHubïŒçŸåšã¯MicrosoftåäžïŒãéçºããCodeQLã¯ããœãŒã¹ã³ãŒããããŒã¿ã®ããã«ã¯ãšãªã§ããã»ãã³ãã£ãã¯ã³ãŒãåæãšã³ãžã³ã§ããã³ãŒãããŒã¹ãããªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ãæ§ç¯ãããŠãŒã¶ãŒãã¯ãšãªãèšè¿°ããããšã§ãã»ãã¥ãªãã£è匱æ§ãããã©ãŒãã³ã¹åé¡ãã³ãŒãã£ã³ã°äžã®æ¬ é¥ãæ€åºã§ããŸããGitHub Advanced SecurityïŒGHASïŒã®äžéšãšããŠãCodeQLã¯ç¹ã«ãªãŒãã³ãœãŒã¹ã«ãããå€§èŠæš¡ãªè匱æ§ãã³ãã£ã³ã°ã«ãããŠäžå¿çãªåœ¹å²ãæãããŠããŸãã
C# ã¯å ¬åŒã«ãµããŒããããŠããèšèªã® 1 ã€ã§ãããGitHub 㯠.NET ããŒã¹ã®ãšã³ã·ã¹ãã ã®ãµããŒããæ¡å€§ããŠããŸãã
åªäœæ§
- æå¹ã«ãã æ·±ãæå³åæ C#ã³ãŒããå¶åŸ¡ãããŒãšããŒã¿ãããŒãã¢ãã«åããŠãè€éãªè€æ°ã¹ãããã®è匱æ§ãæ€åºããŸãã
- GitHub ãã€ãã£ãã®ã¯ãŒã¯ãããŒãšé£æºãããã«ãªã¯ãšã¹ããããã·ã¥ã€ãã³ããã¹ã±ãžã¥ãŒã«ãããã»ãã¥ãªãã£ã¹ãã£ã³ãžã®ã·ãŒã ã¬ã¹ãªçµ±åãå®çŸããŸãã
- å®å šã§ãªããã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ãæ€èšŒãããŠããªãå ¥åããã¹ãã©ããŒãµã«ãã€ã³ãžã§ã¯ã·ã§ã³ãã¿ãŒã³ãªã©ã®èŠã€ãã«ããåé¡ãæ€åºã§ããŸãã
- GitHubã®æé·ã«æ¯ããã㊠ã¯ãšãªã©ã€ãã©ãªOWASP Top 10ããã³CWEæºæ ã«ãŒã«ãå«ã
- Datalog ã«åºã¥ãå°çšèšèªã䜿çšããŠãã«ã¹ã¿ã CodeQL ã¯ãšãªãèšè¿°ããããã®å®å šãªå¶åŸ¡ãæäŸããŸãã
- ããŒãžã§ã³ç®¡çã«å¯Ÿãã匷ãæèããã©ã³ãã PR å šäœã®å€æŽã远跡ã§ãã
- GitHub ActionsããŒã¹ã®ã¹ã±ãŒãªã³ã°ã«ãããå€§èŠæš¡ãªã³ãŒãããŒã¹ããã«ããªããžããªçµç¹ã«é©ããŠããŸãã
- ãªãŒãã³ãœãŒã¹ã®ã¯ãšãªããã¯ã«ãããã³ãã¥ããã£ãéçºããã»ãã¥ãªãã£ãã§ãã¯ã®åå©çšãšå ±æãå¯èœ
- ã»ãã¥ãªãã£ç ç©¶è åãã«å±¥æŽã³ãŒãã¬ãã¥ãŒãšè匱æ§ç£æ»ãå¯èœã«
- GitHub ã»ãã¥ãªã㣠ããŒã ã¯ãã°ããŒãã« CVE ãã³ãã£ã³ã°ã®ããã« CodeQL ã瀟å ã§äœ¿çšããŠããã圱é¿ã®å€§ãããŠãŒã¹ã±ãŒã¹ã§å®æŠãã¹ãæžã¿ãšãªã£ãŠããŸãã
å¶éãšæ¬ ç¹
CodeQL ã¯ã詳现ãªéçåæã«äœ¿çšã§ããæã匷åãªããŒã«ã® 1 ã€ã§ãããæ¥åžžã®éçºã§ C# ã«é©çšããå Žåã¯ããã€ãã®æ³šæç¹ããããŸãã
- ã«ã¹ã¿ã ã«ãŒã«ã®åŠç¿æ²ç·ãæ¥å³»
ã«ã¹ã¿ã ã¯ãšãªãäœæããã«ã¯ãç¬èªã®æ§æãšã»ãã³ãã£ãã¯ã¢ãã«ãæã€CodeQLã¯ãšãªèšèªã®ç¥èãå¿ èŠã§ããå€ãã®éçºè ã¯ãçç£æ§ãåäžããããã«å°çšã®ãã¬ãŒãã³ã°ãæéãå¿ èŠãšããŸãã - 建ç¯åºæºããŒã¿ããŒã¹ãå¿
èŠ
ã¯ãšãªãå®è¡ããåã«ãã³ãŒããã³ã³ãã€ã«ããŠCodeQLããŒã¿ããŒã¹ã«å€æããå¿ èŠããããŸãããã®ã¹ãããã¯ãç¹ã«å€§èŠæš¡ãªãªããžããªãé »ç¹ã«å€æŽããããªããžããªã®å ŽåãCIãã€ãã©ã€ã³ã®è€éããšåŠçæéãå¢å ãããŸãã - ãœãŒã¹èšèªã®ç¯å²ãšããŒã«ã«ãã£ãŠå¶éããã
C#ã¯ãµããŒããããŠããŸãããCodeQLã®äž»èŠèšèªã¿ãŒã²ããã§ããJavaãJavaScriptãPythonã«æ¯ã¹ãäºåæ§ç¯ãããã«ãŒã«ãã¯ãšãªå質ã®é¢ã§å£ã£ãŠããå¯èœæ§ããããŸãããŸãã.NETç¹æã®é«åºŠãªåäœïŒãªãã¬ã¯ã·ã§ã³ãã©ã³ã¿ã€ã ã³ãŒãçæãªã©ïŒã®ã¢ãã«åãé£ããå ŽåããããŸãã - ã¹ã¿ã€ã«ãæžåŒã®ã«ãŒã«ã«ã¯é©ããŠããŸãã
CodeQLã¯ãã¹ã¿ã€ã«ã¬ã€ããã³ãŒãã®ãã©ãŒãããã匷å¶ããããã«ã¯èšèšãããŠããŸãããè«ççãã»ãã³ãã£ãã¯ããããŠã»ãã¥ãªãã£ã«åºã¥ãããã¿ãŒã³ã«å³å¯ã«çŠç¹ãåœãŠãŠããŸãã - IDEãµããŒãã®æ¬ åŠ
Visual Studio ãŸã㯠Rider ãšã®çŽæ¥çãªçµ±åã¯ãªããããéçºè 㯠CI/CD ãã£ãŒãããã¯ã«é ŒãããCLI ããŒã«ãæåã§äœ¿çšããå¿ èŠããããŸãã - ãã«æ©èœã䜿çšããã«ã¯ãšã³ã¿ãŒãã©ã€ãºã©ã€ã»ã³ã¹ãå¿
èŠ
ãããŒãžãCodeQLãµãŒãã¹ãæäŸããGitHub Advanced SecurityïŒGHASïŒã¯ãGitHub Enterprise Cloudããã³Serverã®ã客æ§ã®ã¿ãå©çšã§ããŸãããã®ãããGitHubã䜿çšããŠããªãããŒã ã§ã¯å°å ¥ãå¶éãããŸãã - å°èŠæš¡ãããžã§ã¯ãã§ã¯äŸ¡å€ãéããã
ã·ã³ãã«ãª C# ã¢ããªãè¿ éãªçµæãæ±ããããŒã ã®å ŽåãRoslyn ã ReSharper ãªã©ã®è»œéããŒã«ãšæ¯èŒããŠãCodeQL ã®ã»ããã¢ãããšè€éããã¡ãªãããäžåãå¯èœæ§ããããŸãã
CodeQLã¯ãã»ãã¥ãªãã£ãéèŠããã«ã¹ã¿ã ã¯ãšãªã»ãããšã¯ãŒã¯ãããŒã®æ§ç¯ã«æè³ããææ¬²ã®ããçµç¹ã«æé©ã§ããã³ã³ãã©ã€ã¢ã³ã¹èŠä»¶ãé«ããè€æ°ã®ã³ã³ããªãã¥ãŒã¿ãŒãé¢äžããæçããDevSecOpsæåãæã€C#ãããžã§ã¯ãã«æé©ã§ãããã以å€ã®çµç¹ã§ã¯ãåŸæ¥ã®ã¢ãã©ã€ã¶ãŒãè£å®ããã¬ã€ã€ãŒãšããŠæé©ã§ãã
åæ°é
Aikido Securityã¯ãã¢ããªã±ãŒã·ã§ã³ã»ãã¥ãªãã£åéã«ãããæ°èäŒæ¥ã§ããéçºè ã«ãšã£ãŠäœ¿ããããSASTãSCAãã·ãŒã¯ã¬ããã¹ãã£ã³ãçµ±åãã©ãããã©ãŒã ã§æäŸããŠããŸããã·ã³ãã«ããšã¹ããŒãã念é ã«æ§ç¯ãããŠãããGitHubãGitLabãBitbucketãAzure DevOpsãšãã£ãäž»èŠãã©ãããã©ãŒã ãšã®é£æºãããã«è¡ãããããææ°ã®éçºã¯ãŒã¯ãããŒã«æé©ã§ãã
Aikido 㯠ReSharper ã CodeQL ã®ãããªåŸæ¥ã®è©³çްãªéçã³ãŒã ã¢ãã©ã€ã¶ãŒã§ã¯ãããŸããããC# ããã³ .NET ãããžã§ã¯ãããµããŒãããç¹ã«ã»ãã¥ãªãã£ã®è匱æ§ãšäŸåé¢ä¿ã®ãªã¹ã¯ã®é åã§è²ŽéãªæŽå¯ãæäŸããŸãã
åªäœæ§
- GitHubãGitLabãBitbucketãAzure ã® CI/CD ã¯ãŒã¯ãããŒã«ç°¡åã«çµ±åã§ãã軜éèšèš
- SASTãSCAïŒãœãããŠã§ã¢æ§æåæïŒãããã³ã·ãŒã¯ã¬ããã®çµã¿èŸŒã¿ã¹ãã£ã³ã1ã€ã®ãã©ãããã©ãŒã ã§æäŸããŸãã
- ããŒãã³ãŒããããã·ãŒã¯ã¬ãããSQLã€ã³ãžã§ã¯ã·ã§ã³ãå®å šã§ãªãäŸåé¢ä¿ãªã©ã®äžè¬çãªèåŒ±æ§æ€åºãã¿ãŒã³ãåããC#ããµããŒãããŸãã
- ã»ãã¥ãªãã£å°éå®¶ã§ã¯ãªããéçºè ãDevOpsããŒã åãã«èšèšãããã¯ãªãŒã³ã§ã¢ãã³ãªUI
- ã³ã³ããã¹ãèªèã«ããåé¡ã®ããªã¢ãŒãžãšãªã¹ã¯ã®åªå é äœä»ãã«ãããã¢ã©ãŒãç²ããåé¿ã§ããŸãã
- ããªã·ãŒããŒã¹ã®å¶åŸ¡ãæå¹ã«ããïŒäŸïŒé倧ãªåé¡ãèŠã€ãã£ãå Žåã¯ããŒãžããããã¯ããïŒ
- ãããžã§ã¯ããšèšèªã®èªåæ€åºã«ãããã«ãŒã«èšå®ã«ã»ããã¢ããã¯äžèŠ
- å°èŠæš¡ããŒã ããªãŒãã³ãœãŒã¹è²¢ç®è åãã®ç¡æãã©ã³ãã
- ãã«ãªã¯ãšã¹ãã§å®çšçãªåºåãåŸãããé«éã¹ãã£ã³æé
- GDPRãšISO 27001ã«æºæ ããã»ãã¥ãªãã£ç¬¬äžã®äŒæ¥æå
å¶éãšæ¬ ç¹
Aikido ã¯çŸä»£ã®ããŒã ã«ãšã£ãŠçŽ æŽããã DevSecOps ãã©ãããã©ãŒã ã§ãããC# ç¹æã®è©³çްãªéçåæãé«åºŠãªã³ãŒãæ€æ»ãæ±ãã人ã«ãšã£ãŠã¯å¶çŽããããŸãã
- è€é㪠C# ã³ãŒã ãã¿ãŒã³ã®ã«ãŒã«ã®æ·±ããå¶éããã
Aikido ã¯ã³ãŒãå質ãããã»ãã¥ãªã㣠ã¹ãã£ã³ã«éç¹ã眮ããŠãããNDepend ã ReSharper ãªã©ã®ããŒã«ãæäŸããè«ççãŸãã¯ããã©ãŒãã³ã¹é¢é£ã®ãã§ãã¯ã®å€ããæ¬ ããŠããŸãã - æ§é èšèšäžã®æ¬ é¥ããªãã¡ã¯ã¿ãªã³ã°ã®ææ¡ã®æ€åºã«ã¯é©ããŠããŸãã
ãªããžã§ã¯ã ã¢ãã«ã®èª€çšã埪ç°äŸåé¢ä¿ããŸãã¯ãšã³ã¿ãŒãã©ã€ãº ã°ã¬ãŒãã®ã¢ããªã±ãŒã·ã§ã³ã«ããããã¢ãŒããã¯ãã£äžã®åé¡ãç¹å®ã§ããŸããã - ã«ã¹ã¿ã ã«ãŒã«ã®äœæã埮調æŽãããæ§æã®ãµããŒãããªã
CodeQL ã Roslyn ã¢ãã©ã€ã¶ãŒãšã¯ç°ãªãããŠãŒã¶ãŒã¯ç¬èªã®éçã«ãŒã«ãå®çŸ©ããããæ€åºããžãã¯ãç°¡åã«æ¡åŒµãããããããšã¯ã§ããŸããã - Visual Studio ãŸã㯠IDE ãšã®çµ±åãªã
ãã¹ãŠã®çµæã¯ãŠã§ãã€ã³ã¿ãŒãã§ãŒã¹ãŸãã¯ãã«ãªã¯ãšã¹ãã®ã³ã¡ã³ããéããŠè¡šç€ºãããŸããIDEããŒã¹ã®ãªã³ãã£ã³ã°ã«æ £ããŠããéçºè ã«ãšã£ãŠã¯ããããç ©ãããæãããããããŸããã - äž»ã«GitããŒã¹ã®ã¯ãŒã¯ãããŒãäžå¿ã«æ§ç¯ãããŠããŸã
éäžåãœãŒã¹ç®¡çãŸãã¯å€ããããã€ã¡ã³ã ã¢ãã«ã䜿çšããŠããããŒã ã¯ãèªååæ©èœã®ã¡ãªããã享åã§ããªãå¯èœæ§ããããŸãã - ã¹ãã£ã³ã¯äž»ã«CIã§è¡ãããããŒã«ã«éçºäžã«ã¯è¡ãããŸããã
éçºè ã¯ãŒã¯ãããŒå ã«ã¯ãäºåã³ãããããã¯ãã©ã€ã ã³ãŒã ãã£ãŒãããã¯çšã®ãã€ãã£ã ããŒã«ã¯ãããŸããã
Aikidoã¯ãã»ãã¥ãªãã£æèã®é«ãã¯ã©ãŠããã€ãã£ããªããŒã ãææ°ã®CI/CDãã€ãã©ã€ã³ã§C#ã䜿çšããã®ã«æé©ã§ããäžè¬çãªè匱æ§ãã·ãŒã¯ã¬ããã«å¯Ÿããè¿ éãªæŽå¯ãšåªããã«ãã¬ããžãæäŸããŸãããã ããã¢ãŒããã¯ãã£åæãã«ã¹ã¿ã ã«ãŒã«ã®æè»æ§ãé«åºŠãªå質管çãå¿ èŠãšããããŒã ã«ã¯ãåŸæ¥ã®ã³ãŒãã¢ãã©ã€ã¶ãŒãšã®äœµçšãæšå¥šãããŸãã
ãã£ãŒããœãŒã¹
DeepSourceã¯ãéçè§£æããã°æ€åºãã»ãã¥ãªãã£ã¹ãã£ã³ããããŠè€æ°èšèªã«ãããã³ãŒããã©ãŒãããæ©èœãæäŸããèªåã³ãŒãã¬ãã¥ãŒãã©ãããã©ãŒã ã§ããPythonãGoãJavaScriptãšãã£ãèšèªãžã®ãµããŒãã匷åãããŠããŸãããDeepSourceã¯C#ã.NETãšã³ã·ã¹ãã ãžã®ãµããŒããåŸã ã«æ¡å€§ããéçºè ãã¯ãªãŒã³ã§å®å šãã€ä¿å®æ§ã®é«ãã³ãŒãããŒã¹ãç¶æã§ããããæ¯æŽããŠããŸãã
GitHubãGitLabãBitbucket ãªã©ã®ããŒãžã§ã³ç®¡çãã©ãããã©ãŒã ãšçµ±åãããã¹ãŠã®ã³ããããšãã« ãªã¯ãšã¹ãã«å¯ŸããŠéçåæãå®è¡ããŸãã
åªäœæ§
- ããã©ãŒãã³ã¹ããã°ãªã¹ã¯ãã¢ã³ããã¿ãŒã³ãã»ãã¥ãªãã£è匱æ§ã«éç¹ã眮ãããC# åãã®ããã«äœ¿ããéçè§£æãµããŒã
- GitHubãGitLabãBitbucketãšã®ã·ãŒã ã¬ã¹ãªçµ±åã«ããããã«ãªã¯ãšã¹ãã«å¯Ÿãããªã¢ã«ã¿ã€ã ã®ãã£ãŒãããã¯ãå®çŸ
- äžè¬çãªã³ãŒãåé¡ã®è§£æ±ºãè¿ éåããããã«èªåä¿®æ£ææ¡ãæäŸããŸã
- ãªããžããªãšããŒã å šäœã®ã³ãŒãå¥å šæ§ã«é¢ããåææ å ±ãæäŸããçµ±åããã·ã¥ããŒã
- ã³ãŒãæ§é ã®èªåæ€åºã«ãã軜éã§ãŒãæ§æã®ãªã³ããŒãã£ã³ã°
- ã³ãŒãã®å€æŽãéè€ãã«ãã¬ããžã®åŸåãªã©ã®ææšãå«ãŸããŸã
- æéãšãã©ã³ãããŸããã ã³ãŒãå質ã®ååž°ã«é¢ããè¿ éãªæŽå¯ãæäŸããŸã
- ç¡èŠã«ãŒã«ãæå¶ãé倧床調æŽããµããŒããããã€ãºå¶åŸ¡ãæ¹åããŸã
- Web UIã¯çŽæçã§ãéçºè ãšãšã³ãžãã¢ãªã³ã°ãªãŒããŒã®äž¡æ¹ã«é©ããŠããŸã
- ãšã³ã¿ãŒãã©ã€ãºæ©èœã«ã¯ãããŒã ããŒã¹ã®æš©éãšã³ã³ãã©ã€ã¢ã³ã¹ããã·ã¥ããŒããå«ãŸããŸãã
å¶éãšæ¬ ç¹
æ¥éã«æé·ããŠãããã©ââãããã©ãŒã ã§ããã«ãããããããDeepSourceã¯ãç¹ã«æ¬¡ã®ãããªçšéã§äœ¿çšããå Žåã«ã¯ããã€ãã®æ¬ ç¹ããããŸãã C#ãããžã§ã¯ã ãšã³ã¿ãŒãã©ã€ãºãŸãã¯å€§èŠæš¡éçºã®å Žå:
- C#ã®ãµããŒãã¯PythonãJavaScriptã»ã©æçããŠããªã
DeepSource ã«ã¯ãç¹ã«è€é㪠.NET ã¢ããªã±ãŒã·ã§ã³ ãã¿ãŒã³ã®å ŽåãRoslynãReSharperãNDepend ãªã©ã®ããŒã«ã«èŠãããéçã«ãŒã«ã®æ·±ããšå¹ ãæ¬ ããŠããŸãã - ã«ãŒã«ã®ã«ã¹ã¿ãã€ãºãå¶éãããŠãã
ãŠãŒã¶ãŒã¯ããã¡ã€ã³åºæèšèªã䜿çšããŠã«ã¹ã¿ã ã®éçåæã«ãŒã«ãå®çŸ©ãããããã€ãã£ãã§ãµããŒããããŠããç¯å²ãè¶ ããŠã«ãŒã« ã»ãããæ¡åŒµãããããããšã¯ã§ããŸããã - Visual Studioãšã®çµ±åãªã
Visual Studio ã Rider ãªã©ã® IDE ã§äœæ¥ããéçºè ã¯ãCI ããŒã¹ã®ãã£ãŒãããã¯ã«é ŒãããDeepSource Web UI ã§çµæãæåã§ç¢ºèªããå¿ èŠããããŸãã - ã³ãŒã ã¬ãã«ã®åé¡ã«çŠç¹ãåœãŠãŠããŸãããã¢ãŒããã¯ã㣠ã¬ãã«ã®åæãã³ãŒãæ§é ã®æé©åã«ã€ããŠã¯åãäžããŠããŸããã
- é«åºŠãªãããŒåæãããŒã¿ãã¬ãŒã¹ã¯ãµããŒããããŠããŸãã
ããã«ãããè€æ°è¡ã®è匱æ§ãè€éãªã»ãã¥ãªã㣠ããžãã¯ã®éå®³ãæ€åºãã广ãäœäžããŸãã - ãã¬ãã¢ã æ©èœã¯ãšã³ã¿ãŒãã©ã€ãºãã©ã³ã§ã®ã¿å©çšå¯èœã§ã
å±¥æŽè¿œè·¡ãã³ã³ãã©ã€ã¢ã³ã¹ ã¬ããŒããããªã·ãŒé©çšãªã©ã®æ©èœã«ã¯ãäžäœã¬ãã«ã®ã©ã€ã»ã³ã¹ãå¿ èŠã§ãã - äž»ã«ã¯ã©ãŠãããŒã¹ã§ãå³ããèŠå¶ãããç°å¢åãã®ãªã³ãã¬ãã¹ãªãã·ã§ã³ã¯éãããŠãã
DeepSourceã¯ã詳现ãªèšå®ãå¿ èŠãšãããè¿ éãã€èªåçãªéçè§£æãæ±ããäžå°èŠæš¡ã®C#ããŒã ã«ãšã£ãŠæé©ãªéžæè¢ã§ããGitããŒã¹ã®CIã¯ãŒã¯ãããŒã«æé©ã§ãåŸæ¥ã®ã³ãŒããªã³ã¿ãŒãè£å®ããŸãããšã³ã¿ãŒãã©ã€ãºã¬ãã«ã®ãããžã§ã¯ãããã¢ãŒããã¯ãã£ã«é¢ããè©³çŽ°ãªæ å ±ã.NETå éšæ§é ã®ãµããŒããæ±ããããŒã ã§ã¯ãä»ã®å°éçãªã¢ãã©ã€ã¶ãŒãšçµã¿åãããå¿ èŠããããããããŸããã
æšè«#
Infer#ã¯ãFacebookã®Inferãã¬ãŒã ã¯ãŒã¯ãããŒã¹ã«Microsoft ResearchãéçºããC#çšã®éçè§£æããŒã«ã§ããããã·ãŒãžã£éè§£æã«ç¹åããŠãããnullåç §ããªãœãŒã¹ãªãŒã¯ãç«¶åç¶æ ãã¡ãœããå¢çãè¶ããã¡ã¢ãªåé¡ãšãã£ãè€éãªãã°ãæ€åºã§ããŸããInfer#ã¯ãåŸæ¥ã®ãªã³ã¿ãŒã§ã¯æ€åºãããªãããããã¯å®è¡æã«ããæ€åºãããªããããªãæ·±ãã»ãã³ãã£ãã¯ãã°ãéçºè ãæ€åºã§ããããã«æ¯æŽããããšãç®çãšããŠããŸãã
ããã¯ã.NET äžéèšèª (IL) ãå éšè¡šçŸã«å€æããé«åºŠãªåœ¢åŒæ€èšŒåæãå®è¡ããããšã§æ©èœããŸãã
åªäœæ§
- Facebookã®Inferãšã³ãžã³ãããŒã¹ã«ããŠãããã¢ãã€ã«ããã³ãµãŒããŒãµã€ãã³ãŒãã®é«åºŠãªéçè§£æã§åºãè©äŸ¡ãããŠããŸãã
- ããã·ãŒãžã£éããã³ã·ã³ããªãã¯è§£æãå®è¡ããè€æ°ã®ã¡ãœãããŸãã¯ã¯ã©ã¹ã«ãŸãããåé¡ãæ€åºããŸãã
- ç¹ã«ããã«ãã€ã³ã¿åç §ãã¡ã¢ãªãªãŒã¯ãåæå®è¡ã®åé¡ãç¹å®ããã®ã«äŸ¿å©ã§ãã
- .NET äžéèšèª (IL) ã«ã€ããŠæšè«ããããšãã§ãããã¹ãŠã® .NET 察å¿èšèªã«ãããåæãå¯èœã«ãªããŸãã
- 匷åãªåŠè¡çåºç€ãæã€Microsoft Researchã«ãã£ãŠç©æ¥µçã«éçºãããŠããŸã
- ãªãŒãã³ãœãŒã¹ãäŒæ¥ãåŠè¡æ©é¢ã§ã®äœ¿çšã«é©ããã©ã€ã»ã³ã¹
- èªååæã®ããã®MSBuildããã³CIãã€ãã©ã€ã³ãšã®çµ±åãå¯èœ
- ç ç©¶ç°å¢ãå®å šãªã³ãŒãã£ã³ã°ç£æ»ãåœ¢åŒæ€èšŒã¯ãŒã¯ãããŒã®äžéšãšããŠåœ¹ç«ã¡ãŸãã
- æšæºããŒã«ã§ã¯æ€åºãé£ããæœåšçãªã©ã³ã¿ã€ã ã¯ã©ãã·ã¥ãããžãã¯éå®³ãæ€åºããŸã
å¶éãšæ¬ ç¹
Infer# ã¯ãã®ç¯å²ã§ã¯åŒ·åã§ãããäžè¬çãªéçºã¯ãŒã¯ãããŒã§ã®äœ¿çšãå¶éããè€æ°ã®æ¬ ç¹ããããŸãã
- ãã«æ©èœã®éçè§£æããŒã«ã§ã¯ãªã äžè¬çãªã³ãŒãã¹ã¿ã€ã«ããã¶ã€ã³ãä¿å®æ§
Infer# ã¯ãã°æ€åºã«çŠç¹ãçµã£ãŠãããNDepend ã ReSharper ã®ãããªã³ãŒãå質ã¡ããªã¯ã¹ãè€éãã®åæãã¢ãŒããã¯ãã£ã®æŽå¯ã¯æäŸããŸããã - Visual Studio ã IDE ãšã®çµ±åã¯ãããŸãã
ãã¹ãŠã®æäœã¯ã³ãã³ãã©ã€ã³ã§è¡ãããŸãããšãã£ã¿å ã§ã®ãã£ãŒãããã¯ãèªåä¿®æ£ãæåŸ ããéçºè ã«ã¯é©ããŠããŸããã - é«ãæè¡çåå
¥éå£
ç¹å®ã®åºåãè§£éããã«ã¯ãILãã³ãã³ãã©ã€ã³æäœã«é¢ããç¥èãããã³å Žåã«ãã£ãŠã¯åœ¢åŒææ³ã«é¢ããããçšåºŠã®ç¥èãå¿ èŠã§ãã - ããã¥ã¡ã³ããšã³ãã¥ããã£ãµããŒããä¹ãã
Roslyn ã¢ãã©ã€ã¶ãŒã SonarQube ãªã©ã®ããŒã«ãšæ¯èŒãããšãInfer# ã«ã¯ãã©ãã«ã·ã¥ãŒãã£ã³ã°ã®ããã®åºç¯ãªãã¥ãŒããªã¢ã«ãäŸãã¢ã¯ãã£ããªãã©ãŒã©ã ããããŸããã - åºç¯ãªæ¬çªç°å¢ã§ã®äœ¿çšã®ããã«ç©æ¥µçã«ã¡ã³ããã³ã¹ãããŠããªã
ãã㯠Microsoft Research ãããžã§ã¯ãã§ãããããäžè²«ããæŽæ°ãå®çšŒåã¬ãã«ã®ãµããŒããæäŸãããªãå¯èœæ§ããããŸãã - SCAïŒäŸåé¢ä¿ïŒã¹ãã£ã³ãã»ãã¥ãªãã£åºæã®ã«ãŒã«ã¯ãããŸãã
å€ãããã±ãŒãžãå®å šã§ãªã API ã®äœ¿çšããã®ä»ã®è¡šé¢çãªã»ãã¥ãªãã£äžã®æžå¿µãæ€åºããããšã¯ã§ããŸããã - å€§èŠæš¡ãšã³ã¿ãŒãã©ã€ãºãããžã§ã¯ãã«ãããã¹ã±ãŒã©ããªãã£ã®æžå¿µ
å€§èŠæš¡ãªã³ãŒãããŒã¹ã«é©çšãããšãåæãé ããªããããªãã®ã·ã¹ãã ãªãœãŒã¹ãæ¶è²»ããå¯èœæ§ããããŸãã
Infer#ã¯ãæ£åŒãªãã°æ€åºãéèŠããããŒã ã調æ»éèŠã®ç°å¢ããŸãã¯ãã¹ã«æ·±ãäŸåãã詳现ãªåæãæ±ããããç£æ»ã«æé©ã§ããäžè¬çãªãšã³ã¿ãŒãã©ã€ãºC#éçºã«ãããæ¥åžžçãªéçè§£æã®ããã®ã¿ãŒã³ããŒãœãªã¥ãŒã·ã§ã³ã§ã¯ãããŸããããã»ãã¥ã¢ãŸãã¯ã»ãŒããã£ã¯ãªãã£ã«ã«ãªéçºç°å¢ã«ãããŠåŒ·åãªè£å®ããŒã«ãšããŠæ©èœããŸãã
ããŒãã¹ãã£ã³
Puma Scanã¯ã.NETããã³C#ã¢ããªã±ãŒã·ã§ã³ã®ã»ãã¥ãªãã£è匱æ§ãç¹ã«ã»ãã¥ã¢ã³ãŒãã£ã³ã°ãã©ã¯ãã£ã¹ãšã³ã³ãã©ã€ã¢ã³ã¹ã«é¢é£ããè匱æ§ãç¹å®ããããã«èšèšãããéçè§£æããŒã«ã§ããOWASP Top 10ããã³CWEïŒCommon Weakness EnumerationïŒã«ããŽãªã«éç¹ã眮ããŠæ§ç¯ãããŠãããããã»ãã¥ãªãã£ãéèŠãã.NETããŒã ã«äººæ°ããããŸãã
ãã®ããŒã«ã¯ãVisual Studio ã«çµ±åããã Puma Scan Community Edition ãšãCI/CD çµ±åãã«ãŒã«ã®ã«ã¹ã¿ãã€ãºãéäžã¬ããŒããªã©ã®ãšã³ã¿ãŒãã©ã€ãºæ©èœã远å ãã Puma Scan Professional ã® 2 ã€ã®äž»ãªåœ¢åŒã§å©çšã§ããŸãã
åªäœæ§
- OWASP ããã³ CWE æšæºã«æºæ ããã«ãŒã«ã»ãããåããã.NET ããã³ C# ã»ãã¥ãªã㣠ã¹ãã£ã³åãã«ã«ã¹ã¿ãã€ãºãããŠããŸãã
- Visual Studio ã«çŽæ¥çµ±åãããéçºè ã«ã³ãŒãã£ã³ã°äžã«å³æã®ãã£ãŒãããã¯ãæäŸããŸãã
- ä¿¡é Œã§ããªãå ¥åãã³ãŒãå ãã©ã®ããã«æµãããã远跡ããXSSãSQL ã€ã³ãžã§ã¯ã·ã§ã³ãã³ãã³ã ã€ã³ãžã§ã¯ã·ã§ã³ãªã©ã®åé¡ãæ€åºã§ããã³ãŒã ãããŒåæãæäŸããŸãã
- ãããã§ãã·ã§ãã«çã¯CI/CDãã€ãã©ã€ã³ã®çµ±åããµããŒãããDevSecOpsã®å®è·µã«é©ããŠããŸãã
- è匱æ§ã®ã«ããŽãªãé倧床ã¬ãã«ã修埩ã¬ã€ãã³ã¹ãå«ã詳现ãªã¬ããŒããçæããŸãã
- ç¬èªã®ã³ãŒããã¿ãŒã³ã«ã«ã¹ã¿ã ã«ãŒã«ã远å ã§ããŸãïŒProfessional ã®ã¿ïŒ
- ããŒã ãSDLCã®æ©ã段éã§å®å šãªã³ãŒãã£ã³ã°ããªã·ãŒã宿œã§ããããã«æ¯æŽããŸã
- èŠå¶ç£æ¥ã®å®å šãªéçºã©ã€ããµã€ã¯ã«èŠä»¶ãè£å®ããããã«èšèš
- Secure Development Solutionsã«ãã£ãŠç¶æãããã«ãŒã«ã»ãããç¶ç¶çã«æŽæ°ãããŠããŸã
å¶éãšæ¬ ç¹
Puma Scan ã¯åŒ·å㪠C# ã»ãã¥ãªãã£åæãæäŸããŸãããç¹ã«å¹ åºãéçåæãã©ãããã©ãŒã ãšæ¯èŒãããšãããã€ãã®é¡èãªå¶éããããŸãã
- ã»ãã¥ãªãã£ã«éç¹ã眮ã
Puma Scanã¯ãããã©ãŒãã³ã¹ã®åé¡ãä¿å®æ§ãã³ãŒãã®èããèšèšäžã®æ¬ é¥ã®åæã¯æäŸããŸããã æ±çšã®éçè§£æããŒã«ã§ã¯ãªã. - ã³ãã¥ããã£ãšãã£ã·ã§ã³ã¯å¶éãããŠããŸã
CI/CDçµ±åãããŒã ã¬ããŒããã«ã¹ã¿ã ã«ãŒã«ããµããŒãæ©èœã¯åããŠããŸããããšã³ã¿ãŒãã©ã€ãºã§ã®äœ¿çšã«ã¯Professionalãšãã£ã·ã§ã³ã®ã¿ã§ã远å ã®ã©ã€ã»ã³ã¹ãå¿ èŠã«ãªãå ŽåããããŸãã - ã«ãŒã«ã»ããã®å¹
ãçã FortifyãCheckmarxãVeracode ãªã©ã®å€§èŠæš¡ãã©ãããã©ãŒã ãããåªããŠããŸãã
Puma Scan ã§ã¯ãããé«åºŠãªæ±æè¿œè·¡ãã³ã³ããã¹ãèªèã¹ãã£ã³ãå¿ èŠãšããè匱æ§ãèŠéãå¯èœæ§ããããŸãã - èŠèŠåã建ç¯çæŽå¯ããªã
NDepend ãªã©ã®ããŒã«ãšã¯ç°ãªããPuma Scan ã¯åŒã³åºãã°ã©ããäŸåé¢ä¿ããããã³ãŒãæ§é åæãæäŸããŸããã - è€æ°èšèªã«ãããSASTã®ãµããŒãäžè¶³
Puma Scan 㯠C# ã®ã¿ã«çŠç¹ãåœãŠãŠãããããå€èšèªã³ãŒãããŒã¹ã JavaScriptãJavaãPython ã®ã¹ãã£ã³ãå¿ èŠãšãããã«ã¹ã¿ã㯠ããŒã ã«ã¯é©ããŠããŸããã - ã¢ããããŒããšã³ãã¥ããã£ã®èŠæš¡ãå°ãã
Snyk ã GitHub ã® CodeQL ãªã©ã®ã»ãã¥ãªãã£ã«éç¹ã眮ãããšã³ã·ã¹ãã ãšæ¯èŒãããšãPuma Scan ã®ãŠãŒã¶ãŒ ããŒã¹ãšã³ãã¥ãã㣠ãµããŒãã¯éãããŠããŸãã
Puma Scanã¯ãã»ãã¥ãªãã£ãæåªå ã«èããèåŒ±æ§æ€åºãã·ããã¬ããåããæ¥ã ã®ã¯ãŒã¯ãããŒã®äžéšãšããŠã»ãã¥ã¢ãªã³ãŒããç¶æãããC#éçºããŒã ã«æé©ã§ããéèãå»çãªã©ãã³ã³ãã©ã€ã¢ã³ã¹ãéèŠãããæ¥çã§ã¯ç¹ã«æå¹ã§ãããã ããããå æ¬çãªåæãå¹ åºãèšèªãµããŒããæ±ããããŒã ã§ã¯ãPuma Scanãè£å®çãªããŒã«ãšçµã¿åãããå¿ èŠããããããããŸããã
ã»ãã¥ãªãã£ã³ãŒãã¹ãã£ã³
Security Code Scan (SCS) ã¯ãC# ããã³ .NET ã¢ããªã±ãŒã·ã§ã³ã®ã»ãã¥ãªãã£è匱æ§ãç¹å®ããããã«èšèšããããRoslyn ããŒã¹ã®ç¡æãã€ãªãŒãã³ãœãŒã¹ã®éçè§£æããŒã«ã§ããVisual Studio ããã³ MSBuild ãä»ããŠãã«ããã€ãã©ã€ã³ãšéçºè ã¯ãŒã¯ãããŒã«çŽæ¥çµ±åãããç¹ã« OWASP Top 10 ããã³ CWE æšæºã§ãã©ã°ä»ããããå®å šã§ãªãã³ãŒãã£ã³ã°ãã¿ãŒã³ã®æ€åºã«éç¹ã眮ããŠããŸãã
SCS ã¯ãè€éãªã»ããã¢ãããç ©éãªã©ã€ã»ã³ã¹ãå¿ èŠãšãããéçºäžã«è»œéã§ã»ãã¥ãªãã£éèŠã®ãã£ãŒãããã¯ãæ±ããéçºè ã«ãšã£ãŠç¹ã«äŸ¡å€ããããŸãã
åªäœæ§
- Roslyn ã³ã³ãã€ã© ãã©ãããã©ãŒã ã䜿çšããŠæ§ç¯ãããŠããããã.NET ãšã³ã·ã¹ãã ãšã®é«ãäºææ§ããããŸãã
- Visual Studioããã³MSBuildãšã®ã·ãŒã ã¬ã¹ãªçµ±åã«ããããªã¢ã«ã¿ã€ã ã®æ€åºãšãã£ãŒãããã¯ãå¯èœ
- 次ã®ãããªäžè¬çãªè匱æ§ãã¿ãŒã²ããã«ããŸã:
- SQLã€ã³ãžã§ã¯ã·ã§ã³
- XSSïŒã¯ãã¹ãµã€ãã¹ã¯ãªããã£ã³ã°ïŒ
- ããŒãã³ãŒããããè³æ Œæ å ±
- å®å šã§ãªãéã·ãªã¢ã«å
- ã³ãã³ãã€ã³ãžã§ã¯ã·ã§ã³
- 軜éãã€é«éããã«ãããã©ãŒãã³ã¹ã«å€§ããªåœ±é¿ãäžããŸããã
- NuGet ãŸã㯠GitHub Actions ãä»ã㊠CI/CD ãã€ãã©ã€ã³ã«è¿œå ããŠèªåã¹ãã£ã³ãå®è¡ã§ããŸãã
- é »ç¹ãªã¢ããããŒããšã¢ã¯ãã£ããªGitHubãªããžããª
- C# ãããžã§ã¯ãã«ãããå®å šãªéçºãã©ã¯ãã£ã¹ã®è¯ãåºçºç¹
- SARIF 圢åŒã§ã®åºåããµããŒãããã»ãã¥ãªã㣠ããã·ã¥ããŒããã¢ã°ãªã²ãŒã¿ãšäºææ§ããããŸãã
å¶éãšæ¬ ç¹
C# éçºè ã«ãšã£ãŠéåžžã«æçšã§ããã«ãããããããSecurity Code Scan ã«ã¯ãããå€§èŠæš¡ãªç°å¢ãèŠå¶ã®å³ããç°å¢ã§ã®é©åæ§ã«åœ±é¿ããããã€ãã®å¶éããããŸãã
- éãããç¯å²
ã»ãã¥ãªãã£äžã®è匱æ§ã®ã¿ãã¹ãã£ã³ããŸããã³ãŒãå質ã®åé¡ãããã©ãŒãã³ã¹ã®ããã«ããã¯ãã¢ãŒããã¯ãã£éåã¯æ€åºããŸããã - åºæ¬çãªèåŒ±æ§æ€åº
SCSã¯ããããééããæ€ç¥ããŸãããé«åºŠãª æ±æè¿œè·¡ã æ·±ã ã€ã³ã¿ãŒããã·ãŒãžã£è§£æ, ããŒã¿ãããŒã¢ããªã³ã° Fortify ã CodeQL ãªã©ã®ãšã³ã¿ãŒãã©ã€ãº ã°ã¬ãŒãã®ããŒã«ã«å«ãŸããŠããŸãã - UIãããã·ã¥ããŒããã¬ããŒãã¬ã€ã€ãŒãªã
éçºè ã¯ãèŠèŠåãå±¥æŽè¿œè·¡ãéäžã¬ããŒã管çããªãããã«ãåºåãŸã㯠IDE èŠåã«é Œãå¿ èŠããããŸãã - éå®ãããã«ã¹ã¿ãã€ãº
SCS ã§ã¯ãç¬èªã®è åšãã«ããŒããããã«ã«ãŒã«ã现ãã調æŽããããã«ã¹ã¿ã ã«ãŒã«ã»ãããäœæãããããããšã¯ã§ããŸããã - .NET以å€ã®èšèªã¯ãµããŒããããŠããŸãã
SCSã¯C#/.NETå°çšã§ããå€èšèªã¹ã¿ãã¯ãã¯ãã¹ãã©ãããã©ãŒã ã¢ããªã±ãŒã·ã§ã³ã管çããããŒã ã«ã¯åœ¹ç«ã¡ãŸããã - é«åºŠãªã»ãã¥ãªãã£ãã³ã³ãã©ã€ã¢ã³ã¹ãéèŠãããç°å¢ã«ã¯é©ããŠããŸãã
SCS ã¯äºé²ã«ã¯åœ¹ç«ã¡ãŸãããPCI-DSS ã ISO 27001 ãªã©ã®æšæºã§èŠæ±ãããæ·±ããç£æ»å¯èœæ§ãåç¬ã§ã¯æäŸããŸããã
Security Code Scanã¯ãéçºããã»ã¹ã®æ©ã段éã§ãè€éããå¢ãããšãªãåºæ¬çãªã»ãã¥ã¢ã³ãŒãã£ã³ã°ãã§ãã¯ãå°å ¥ãããå人éçºè ãå°èŠæš¡ããŒã ã«æé©ã§ãããšã³ã¿ãŒãã©ã€ãºã¢ããªã±ãŒã·ã§ã³ãã»ãã¥ãªãã£ãéèŠãªã·ã¹ãã ã§ã¯ãããé«åºŠã§å æ¬çãªã¢ããªã±ãŒã·ã§ã³ã»ãã¥ãªãã£ãã©ãããã©ãŒã ã®è£è¶³ãšããŠæé©ã§ãã
ãœããŒãã¥ãŒã
SonarQubeã¯ãC#ãå«ãå¹ åºãããã°ã©ãã³ã°èšèªã«å¯Ÿå¿ãããã³ãŒãå質ã®ç¶ç¶çãªæ€æ»ã®ããã®äººæ°ã®ãªãŒãã³ãœãŒã¹ãã©ãããã©ãŒã ã§ãããã°ãè匱æ§ãã³ãŒãã®èããéè€ãã³ãŒãããåæããããŒã ãå質ã²ãŒãã宿œããå¥å šãªã³ãŒãããŒã¹ãç¶æããã®ã«åœ¹ç«ã¡ãŸãããã®ããŒã«ã¯ãå°èŠæš¡ããŒã ããå€§èŠæš¡äŒæ¥ãŸã§ãDevOpsã®çµ±åãç¶ç¶çãªå質ç£èŠã®ããã«åºãå©çšãããŠããŸãã
SonarQubeã¯SonarC#ãã©ã°ã€ã³ãéããŠC#åæããµããŒããã.NET Coreã.NET 5以éãããã³ä»¥åã®.NET Frameworkã¢ããªã±ãŒã·ã§ã³ãšäºææ§ããããŸããVisual Studioãªã©ã®äžè¬çãªCI/CDã·ã¹ãã ãIDEãšã¹ã ãŒãºã«çµ±åã§ããŸãã
åªäœæ§
- ãã°ãè匱æ§ãã³ãŒãèãæè¡çè² åµãä¿å®æ§ã¡ããªã¯ã¹ãå«ãå æ¬çãªéçã³ãŒãåæ
- C# ããã³ãã®ä»å€ãã®èšèªã®çµã¿èŸŒã¿ãµããŒããå€èšèªãããžã§ã¯ãã«æé©ã§ãã
- ã³ãŒãå質ã®åŸåãã«ãã¬ããžããããã¹ããããèŠèŠåããããã®éäžããã·ã¥ããŒããæäŸããŸãã
- ã«ã¹ã¿ã å質ã²ãŒãããµããŒããããã«ãªã¯ãšã¹ããŸãã¯CIãã«ãäžã«ã³ãŒãã£ã³ã°æšæºãé©çšããŸãã
- GitHubãAzure DevOpsãJenkinsãGitLabãBitbucketãããã³å€ãã®CI/CDãã©ãããã©ãŒã ãšçµ±åããŸã
- SonarLint ãšäœµçšãããšãVisual Studio ã§çŽæ¥åé¡ã匷調衚瀺ããŸãã
- CWEãOWASPãSANS æšæºã«ãããã³ã°ãããã»ãã¥ãªãã£éèŠã®ã«ãŒã«ãæäŸããŸã
- 詳现ãªã¬ããŒããšå±¥æŽããŒã¿ãçæããååž°ãšæ¹åã远跡ããŸã
- åºæ¬çãªæ©èœãåããç¡æã®ã³ãã¥ãã㣠ãšãã£ã·ã§ã³ãšãé«åºŠãªãšã³ã¿ãŒãã©ã€ãº ãŠãŒã¹ã±ãŒã¹åãã®ææãã©ã³
- ãã©ã³ããšPRåæããµããŒãããããŒãžåã®å質äœäžã鲿¢ããŸãã
å¶éãšæ¬ ç¹
SonarQube ã«ã¯é·æããããã®ã®ãããé«åºŠãªç°å¢ãã»ãã¥ãªãã£ãéèŠãªç°å¢ã§ã® C# éçåæã«äœ¿çšããå Žåãããã€ãã®æ¬ ç¹ããããŸãã
- ã»ãã¥ãªãã£åæã®æ·±ããéãããŠãã
SonarQubeã¯åºæ¬çãªè匱æ§ãã«ããŒããŠããŸããã æ·±å±€æ±æåæ or æé éãããŒè¿œè·¡ FortifyãCodeQLãCheckmarx ãªã©ã - ã«ãŒã«ã®ã«ã¹ã¿ãã€ãºã¯å¶éãããŠããŸã ã³ãã¥ããã£ãšãã£ã·ã§ã³
é«åºŠãªã«ãŒã«ç·šéãã¬ããã³ã¹ãã³ã³ãã©ã€ã¢ã³ã¹ã¬ããŒãã«ã€ããŠã¯ã éçºè çãŸãã¯ãšã³ã¿ãŒãã©ã€ãºçãå¿ èŠã§ãããã«ããã³ã¹ãã远å ãããŸãã - å€§èŠæš¡ãªã³ãŒãããŒã¹ã§ã¯ããã©ãŒãã³ã¹ãäœäžããå¯èœæ§ããã
éåžžã«å€§èŠæš¡ãªãœãªã¥ãŒã·ã§ã³ãåæãããšãã¹ãã£ã³æéãé·ããªããã€ã³ãã©ã¹ãã©ã¯ãã£ã®èª¿æŽãå¿ èŠã«ãªãå ŽåããããŸãã - ã»ããã¢ãããšã¡ã³ããã³ã¹ãå¿
èŠ
ãªã³ãã¬ãã¹å±éã§ã¯ãæ§æãããŒã¿ããŒã¹ ãµããŒããããã¯ã¢ãããæŽæ°ãå¿ èŠãšãªããå°èŠæš¡ãªããŒã ã«ã¯è² æ ããããå¯èœæ§ããããŸãã - å®è¡æã³ã³ããã¹ãããªã
éçè§£æã®ã¿ã§ã¯ã åœéœæ§ ãŸãã¯ãã³ã³ããã¹ãåºæã®å®è¡æã®åé¡ãèŠéãå¯èœæ§ããããŸãã - è
åšã¢ããªã³ã°ãã¢ãŒããã¯ãã£ã®èŠèŠåã®ãã€ãã£ããµããŒããªã
NDepend ã Resharper ã®ããã«ãã³ãŒãæ§é ãäŸåé¢ä¿ããœãããŠã§ã¢ ã¢ãŒããã¯ãã£ã«é¢ããæŽå¯ã¯æäŸãããŸããã - èŠå¶ç£æ¥ã§ã¯ã»ãã¥ãªãã£ã«ãŒã«ãäžååãªå Žåããã
äžè¬çãªèªèã«ã¯åœ¹ç«ã€ãã®ã®ããã©ãããã©ãŒã ã®ã»ãã¥ãªãã£æ©èœã¯ è£è¶³ äŒæ¥å ã®ä»ã®å°çš SAST ããŒã«ã«ãã£ãŠã
SonarQubeã¯ãç¹ã«DevOpsãã€ãã©ã€ã³ã«ãããŠãã³ãŒãå質ã®åäžãšç¶ç¶çãªæ€æ»ã匷åã«æšé²ããéåžžã«å¹æçãªããŒã«ã§ããããããé«åºŠãªã»ãã¥ãªãã£ä¿èšŒãã¢ãŒããã¯ãã£ç£èŠãå®çŸããã«ã¯ãå€å±€çãªéçè§£ææŠç¥ã«ãããŠãä»ã®å°éããŒã«ãšçµã¿åãããŠäœ¿çšââããã®ãæé©ã§ãã
C# éçã³ãŒãåæã®çŸç¶ãšå±æ
ãœãããŠã§ã¢ã®ä¿¡é Œæ§ãããã©ãŒãã³ã¹ãã»ãã¥ãªãã£ãåžžã«ç£èŠãããŠããæä»£ã«ãããŠã éçã³ãŒãåæ C#ã®ãœãããŠã§ã¢éçºã©ã€ããµã€ã¯ã«ã«ãããŠãC#ã¯æ¬ ãããªãèŠçŽ ãšãªã£ãŠããŸããé倧ãªãã°ãæ©æã«çºèŠããããšãèŠå¶éµå®ã確ä¿ããããšãã¯ãªãŒã³ãªã¢ãŒããã¯ãã£ãç¶æããããšãªã©ãç®æšãäœã§ãããæŽå¯ãšä¿èšŒãæäŸããããšãçŽæããããŒã«ã¯æ°å€ãååšããŸãã
CoverityãFortifyãVeracodeãšãã£ãé«åºŠãªåçšãã©ãããã©ãŒã ãããStyleCopãFxCopãSecurity Code Scanãšãã£ãã³ãã¥ããã£æ¯æŽã®ãŠãŒãã£ãªãã£ãŸã§ãéçºè ãšäŒæ¥ã®äž¡æ¹ã«å¹ åºããœãªã¥ãŒã·ã§ã³ãæäŸãããŠããŸããããããã«ç¬èªã®åŒ·ã¿ãããã詳现ãªè匱æ§ã¹ãã£ã³ãæäŸãããã®ãããã°ãã¢ãŒããã¯ãã£ã¢ããªã³ã°ãéçºè ã®çç£æ§ãã·ãŒã ã¬ã¹ãªCI/CDçµ±åãéèŠãããã®ããããŸãã
泚ç®ãã¹ãã¯ããã«ãããŒã«æŠç¥ã®éèŠæ§ãé«ãŸã£ãŠããããšã§ããçŸä»£ã®ãšã³ãžãã¢ãªã³ã°çµç¹ã¯ãåäžã®ã¢ãã©ã€ã¶ãŒã«äŸåããããšã¯ã»ãšãã©ãããŸããã代ããã«ãReSharperãCodeRushãRoslyn Analyzerãšãã£ãIDEçµ±åãªã³ã¿ãŒãšãšã³ã¿ãŒãã©ã€ãºã¬ãã«ã®SASTããŒã«ãçµã¿åãããŠãéå±€åãããå¯èŠæ§ãå®çŸããŠããŸããäžæ¹ãDevSecOpsããŒã ã¯ãSemgrepãSnykãCodeQLãšãã£ããœãªã¥ãŒã·ã§ã³ãèªååãã€ãã©ã€ã³ã«çµã¿èŸŒãããšãå¢ããŠããããããã€ã¡ã³ãã®ããªãåããè匱æ§ãžã®å¯ŸåŠã確å®ã«è¡ã£ãŠããŸãã
ãããã®éžæè¢ã®äžã§ã SMART TS XL 匷åãã€æè»ãªãã¬ã€ã€ãŒãšããŠç»å Žãå¹ åºãã«ãŒã«ã«ã¹ã¿ãã€ãºãCOBOLããã³ã¬ã¬ã·ãŒã³ãŒãã®æ£ç¢ºãªãµããŒããåãããšã³ã¿ãŒãã©ã€ãºã°ã¬ãŒãã®éçè§£ææ©èœãæäŸããããã«ææ°ã®C#ã³ãŒãããŒã¹ã«ã察å¿ããŠããŸããåŸæ¥ã®éçºç°å¢ãšã¯ã©ãŠããã€ãã£ãéçºç°å¢ãæ©æž¡ãããèœåã¯ãå質ãšã»ãã¥ãªãã£ãåäžãã©ãããã©ãŒã ã«çµ±åãããå€§èŠæš¡çµç¹ãèŠå¶ã®å³ããçµç¹ããããã¯ãã€ããªããçµç¹ã«ãšã£ãŠç¹ã«äŸ¡å€ããããŸãã
ä»äºã«é©ããããŒã«ã®éžæ
çµå±ã®ãšãããC#ã«æé©ãªéçè§£æããŒã«ã¯ãç¶æ³ã«å€§ããäŸåããŸããããŒã ã¯ä»¥äžã®ãããªèŠçŽ ãèæ ®ããå¿ èŠããããŸãã
- ã³ãŒãããŒã¹ã®ãµã€ãºãšè€éã
- ã»ãã¥ãªãã£ãšã³ã³ãã©ã€ã¢ã³ã¹ã®èŠä»¶
- éçºç°å¢ãšCI/CDãã€ãã©ã€ã³ãšã®çµ±å
- ã«ã¹ã¿ãã€ãºãšã«ãŒã«ã®æ¡åŒµæ§
- ã³ã¹ããã©ã€ã»ã³ã¹ããµããŒãã®ããŒãº
åäžã®ããŒã«ã§ãã¹ãŠã«å¯Ÿå¿ã§ãããã®ã¯ãããŸãããçã®äŸ¡å€ã¯ãã¯ãŒã¯ãããŒãšãªã¹ã¯ã«åãããŠèª¿æŽãããã¢ãã©ã€ã¶ãŒããªã³ã¿ãŒãã¹ãã£ããŒãçµ±åããã¹ã¿ãã¯ãæ§ç¯ããããšã«ãããŸãã
ææ ®æ·±ãããŒã«ã®éžæãšéçºã®ãã¹ã ãã©ã¯ãã£ã¹ãçµã¿åãããããšã§ãããŒã ã¯æè¡çè² åµãå€§å¹ ã«åæžããã»ãã¥ãªãã£äœå¶ã匷åããéçºè ãããåªãããããå®å šã§ãããä¿å®ãããã C# ã³ãŒããæ¯æ¥äœæã§ããããã«ããããšãã§ããŸãã