G-gen ã®æŠäºã§ããåœèšäºã§ã¯ VPC Service Controls ã®ãã©ã€ã©ã³ã¢ãŒãã«ã€ããŠè§£èª¬ããŸãã ã¯ããã« VPC Service Controls ãšã¯ ãã©ã€ã©ã³ã¢ãŒã ãã©ã€ã©ã³ã¢ãŒãã®ä»çµã¿ ãã©ã€ã©ã³ã¢ãŒã æŠèŠ æ§æ èšå®é
ç® Access Context Manager èšå® æš©é ã¢ã¯ã»ã¹ã¬ãã« å¢ç (ãã©ã€ã©ã³ã¢ãŒã) å®äŸè§£èª¬ è©äŸ¡ã®æµã å®äŸ1 ãã°ç¢ºèª åå ã®ç¹å® è©³çŽ°ç¢ºèª èå¯ãšå¯Ÿå¿ å®äŸ2 ãã°ç¢ºèª åå ã®ç¹å® è©³çŽ°ç¢ºèª ãã®1 è©³çŽ°ç¢ºèª ãã®2 èå¯ãšå¯Ÿå¿ æåŸã« é¢é£èšäº ã¯ããã« VPC Service Controls ãšã¯ VPC Service Controls ãšã¯ Google Cloud (æ§ç§° GCP) äžã®ã»ãã¥ãªãã£æ©èœã§ãã å¢ç (perimeter) ãšåŒã°ããè«ççãªå²ããèšããäžããå€ãå€ããäžã®åæ¹åã§ Google Cloud ã®åçš®ãµãŒãã¹ API ãžã®æå³ããªãã¢ã¯ã»ã¹ãé²ãããšã§ãµãŒãã¹ãããŒã¿ãžã®ã»ãã¥ãªãã£ã匷åããŸãã 詳现ã¯ä»¥äžã§è§£èª¬ããŠããŸãããã¡ããããããŠã確èªãã ããã blog.g-gen.co.jp ãã©ã€ã©ã³ã¢ãŒã ãã©ã€ã©ã³ã¢ãŒã (ãã©ã€ã©ã³æ§æ) ãšã¯ãèšå®ããå¢çãä»®æ³çã«é©çšã㊠Google Cloud äžã®ãªãœãŒã¹ããµãŒãã¹ã«äžãã圱é¿ãè©äŸ¡ããããã®ã¢ãŒãã§ãã æœåšçãªäžåã«æ°ã¥ãã¬ãŸãŸå¢çãå®éã«é©çšããŠããŸããšãäºæãã¬ã¢ã¯ã»ã¹æåŠãªã©ãäžãã圱é¿ã¯å°ãªããããŸããã ãã®ãããVPC Service Controls ãå©çšããéã¯ãã©ã€ã©ã³ã¢ãŒãã§å¢çèšå®ãé©åã«è©äŸ¡ãããã®äžã§å®ç°å¢ã«é©çšããæµããé©åãšèšããŸãã åèïŒ ãµãŒãã¹å¢çã®ãã©ã€ã©ã³ ã¢ãŒã ãã©ã€ã©ã³ã¢ãŒãã®ä»çµã¿ ãã©ã€ã©ã³ã¢ãŒãã§èšå®ãããå¢çã¯ä»®æ³çã«é©çšããããããã¢ã¯ã»ã¹ãå®éã«ãããã¯ãããããšã¯ãããŸããã äžæ¹ Cloud Logging ã«ã¯ãã°ãšããŠèšé²ãããŸãããã®ããã管çè
ã¯èšé²ããããã°ããæœåšçãªåé¡ãç¹å®ããŠæœ°ã蟌ã¿ãå¢çèšå®ãããã¹ã圢ã«å°ãããšãã§ããŸãã åèïŒ ãã©ã€ã©ã³ ã¢ãŒãã®å©ç¹ ãã©ã€ã©ã³ã¢ãŒã æŠèŠ æ§æ ãã®ã»ã¯ã·ã§ã³ã§ã¯ä»¥äžã®ã±ãŒã¹ãããšã«ããã©ã€ã©ã³ã¢ãŒãã«ããå¢çèšå®ã®è©äŸ¡ããã»ã¹ã«ã€ããŠè§£èª¬ããŸãã æ€èšŒãããžã§ã¯ãã«ãã°ãæ ŒçŽãã BigQuery ãååšãããšããåæã§ãå¢çãç¹å® IP ã¢ãã¬ã¹ããã®ã¢ã¯ã»ã¹ãèš±å¯ããããã«èšå®ãããŠããããè©äŸ¡ããŸãã æ§æã€ã¡ãŒãž èšå®é
ç® äžèšæ§æã¯ä»¥äžã®ãµãŒãã¹ãå©çšããŠããŸãã # ãµãŒãã¹ èšå®ãããã® ç®ç 1 VPC Service Controls å¢ç (Perimeter) ã¢ã¯ã»ã¹æ¡ä»¶ã«åºã¥ã BigQuery API ãä¿è·ãã 2 Access Context Manager ã¢ã¯ã»ã¹ã¬ãã« (ã¢ã¯ã»ã¹æ¡ä»¶) ã³ã³ããã¹ã (ä»åã§èšãã°ã¢ã¯ã»ã¹å
IP ã¢ãã¬ã¹) ãå®çŸ©ãã Access Context Manager Access Context Manager ã¯ãŒããã©ã¹ãã»ãã¥ãªãã£ãå®çŸãã BeyondCorp Enterprise ã®ã³ã³ããŒãã³ãã®äžã€ã§ãã ããã€ã¹æ
å ±ãã¢ã«ãŠã³ãæ
å ±ãæ¥ç¶ç¶æ³ãªã©ã® èæ¯æ
å ± (ã³ã³ããã¹ã) ãå®çŸ©ããããšãå¯èœã§ãVPC Service Controls ã«é¢é£ä»ããããšãã§ããŸãã åèïŒ Access Context Manager ã®æŠèŠ åèïŒ ã¢ã¯ã»ã¹ã¬ãã« èšå® æš©é 以éã®èšå®æäœãè¡ãã«ã¯ãå
¬åŒããã¥ã¡ã³ãã«åŸãããªã³ã·ãã«ã« IAM ããŒã«ãä»äžããå¿
èŠããããŸãã åèïŒ IAM ã«ããã¢ã¯ã»ã¹å¶åŸ¡ ã¢ã¯ã»ã¹ã¬ãã« ç¹å®ã® IP ã¢ãã¬ã¹ãéä¿¡å
ãšããã¢ã¯ã»ã¹ãå¢çå
ã® BigQuery ã«ã¢ã¯ã»ã¹ã§ãããããAccess Context Manager ã§ IP ã¢ãã¬ã¹ã«åºã¥ãã¢ã¯ã»ã¹ã¬ãã«ãèšå®ããŸãã ã¢ã¯ã»ã¹ã¬ãã«ã®èšå®äŸ èšå®æ¹æ³ã¯ä»¥äžã®å
¬åŒããã¥ã¡ã³ããåèãšããŠããŸãã åèïŒ ããŒã·ã㯠ã¢ã¯ã»ã¹ã¬ãã«ãäœæãã å¢ç (ãã©ã€ã©ã³ã¢ãŒã) 次㫠VPC Service Controls ãããã©ã€ã©ã³ã¢ãŒãã§å¢çãèšå®ããŸãã 以äžã®ç»åã®ããã«ã ãã©ã€ã©ã³ã¢ãŒã ã¿ããéžæããç¶æ
ã§ æ°ããå¢ç ãã¯ãªãã¯ããŸãã ãã©ã€ã©ã³ã¢ãŒãã§å¢çãèšå® å¢ç (ãã©ã€ã©ã³ã¢ãŒã) ã®èšå®äŸ èšå®æ¹æ³ã¯ä»¥äžã®å
¬åŒããã¥ã¡ã³ããåèãšããŠããŸãã åèïŒ ãµãŒãã¹å¢çãäœæãã å®äŸè§£èª¬ è©äŸ¡ã®æµã ãã©ã€ã©ã³ã¢ãŒãã«ããå¢çèšå®ãå®äºãããã以äžã®æµãã§èšå®ãè©äŸ¡ããŠãããŸãã ãšã©ãŒãã°ã®æç¡ã確èªãã ãã°ãã metadata.violationReason ãã£ãŒã«ãã確èªããŠãšã©ãŒã®åå ãç¹å®ããããã§è©³çްã確èªãã ãã°ãå¢çèšå®ãã¢ã¯ã»ã¹ã¬ãã«ãå確èªããŠè¢«çç®æãç¹å®ããŠä¿®æ£ãã å®äŸ1 ãã°ç¢ºèª ãŸãã¯ãšã©ãŒã®æç¡ããã°ããã確èªããŸãã BigQuery ã«ã¢ã¯ã»ã¹ããã®ã¡ãCloud Logging ã®ãã°ãšã¯ã¹ãããŒã©ãã以äžã®ã¯ãšãªãå®è¡ããŠãšã©ãŒãã°ã確èªããŸãã å³ã®ããã«ãšã©ãŒãã°ãèšé²ãããŠããå Žåã¯åå ãç¹å®ããŠãããŸãã åèïŒ ãããã¯ããããªã¯ãšã¹ãã®ç¹å® å¢çã«éåããã¢ã¯ã»ã¹ããã°ãšããŠèšé² (å®éã®ã¢ã¯ã»ã¹ã«ã¯åœ±é¿ããªã) åå ã®ç¹å® 以äžã¯å®éã®ãšã©ãŒãã°ã§ãã(ãããžã§ã¯ã ID çã®å€ãäžéšå å·¥ããŠããŸã) 46è¡ç®ã® metadata.violationReason (ãšã©ãŒåå ) ã«ã¯ NO_MATCHING_ACCESS_LEVEL ãšèšãããŠããããšãããããŸãã { " protoPayload ": { " @type ": " type.googleapis.com/google.cloud.audit.AuditLog ", " status ": { " code ": 7 , " message ": " (Dry Run Mode) Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier: 9eFMI2pfYddKGBxQtFGub4I66MZpMSBV0li3aN0EkyYmGOiL6T0-Sg ", " details ": [ { " @type ": " type.googleapis.com/google.rpc.PreconditionFailure ", " violations ": [ { " type ": " VPC_SERVICE_CONTROLS ", " description ": " 9eFMI2pfYddKGBxQtFGub4I66MZpMSBV0li3aN0EkyYmGOiL6T0-Sg " } ] } ] } , " authenticationInfo ": { " principalEmail ": " yu...i@g-...p " } , " requestMetadata ": { " callerIp ": " 2.3.4.5 ", " requestAttributes ": {} , " destinationAttributes ": {} } , " serviceName ": " bigquery.googleapis.com ", " methodName ": " bigquery.datasets.get ", " resourceName ": " projects/111111111111 ", " metadata ": { " securityPolicyInfo ": { " organizationId ": " 333333333333 ", " servicePerimeterName ": " accessPolicies/596827900003/servicePerimeters/test " } , " @type ": " type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata ", " vpcServiceControlsUniqueId ": " 9eFMI2pfYddKGBxQtFGub4I66MZpMSBV0li3aN0EkyYmGOiL6T0-Sg ", " ingressViolations ": [ { " targetResource ": " projects/111111111111 ", " servicePerimeter ": " accessPolicies/596827900003/servicePerimeters/test ", " targetResourcePermissions ": [ " bigquery.datasets.get " ] } ] , " violationReason ": " NO_MATCHING_ACCESS_LEVEL ", " dryRun ": true , " intermediateServices ": [ " bigquery.googleapis.com " ] , " deviceState ": " Unknown ", " resourceNames ": [ " projects/111111111111/datasets/logdestination " ] } } , " insertId ": " 4fwkn7d1pqp ", " resource ": { " type ": " audited_resource ", " labels ": { " project_id ": " yutakei-test-prj ", " method ": " bigquery.datasets.get ", " service ": " bigquery.googleapis.com " } } , " timestamp ": " 2024-01-30T13:05:14.094591814Z ", " severity ": " ERROR ", " logName ": " projects/yutakei-test-prj/logs/cloudaudit.googleapis.com%2Fpolicy ", " receiveTimestamp ": " 2024-01-30T13:05:14.915645252Z " } è©³çŽ°ç¢ºèª ä»¥äžã®å
¬åŒã¬ã€ãã確èªãããšã NO_MATCHING_ACCESS_LEVEL ã¯ä»¥äžã®ããã«èšãããŠããŸãã ãã®åé¡ã¯ãIP ã¢ãã¬ã¹ãããã€ã¹èŠä»¶ããŸãã¯ãŠãŒã¶ãŒ ID ãå¢çã«å²ãåœãŠãããäžãïŒå
åãïŒã«ãŒã«ãŸãã¯ã¢ã¯ã»ã¹ã¬ãã«ãšäžèŽããŠããªãå Žåã«çºçããŸãã ããšãã°ãç£æ»ã¬ã³ãŒãã® callerIp ãã£ãŒã«ãã«å¯Ÿå¿ãã IP ã¢ãã¬ã¹ãããµãŒãã¹å¢çã®ã¢ã¯ã»ã¹ã¬ãã«ã§å®çŸ©ããã CIDR ç¯å²ãšäžèŽããŸããã åèïŒ VPC Service Controls ã«ãã£ãŠãããã¯ããããªã¯ãšã¹ãã®ãããã° èå¯ãšå¯Ÿå¿ å床ãã°ã確èªãããšã23è¡ç®ã® callerIp (åŒã³åºãå
ã® IP ã¢ãã¬ã¹) ã 2.3.4.5 ãšãªã£ãŠããŸãã ã€ãŸããã®ãšã©ãŒã¯ã ã¢ã¯ã»ã¹ã¬ãã«ã§å®çŸ©ãã IP ãšåŒã³åºãå
IP ã®äžäžèŽ ãåå (ã¢ã¯ã»ã¹ã¬ãã«èšå®ã®ãã¹) ã§çºçãããã®ãšèãããããããåœè©²èšå®ãä¿®æ£ããŠãšã©ãŒãè§£æ¶ããŸãã å®äŸ2 ãã°ç¢ºèª å床ãšã©ãŒã®æç¡ã確èªããŸãããããšå
çšãšã¯ç°ãªããšã©ãŒãèšé²ãããŠããŸãã è©äŸ¡äŸ1ãšã¯ç°ãªããšã©ãŒãã°ãèšé² åå ã®ç¹å® 以äžã¯å®éã®ãšã©ãŒãã°ã§ãã(ãããžã§ã¯ã ID çã®å€ãäžéšå å·¥ããŠããŸã) metadata.violationReason ã«ã€ããŠã¯å
çšåæ§ NO_MATCHING_ACCESS_LEVEL (ã¢ã¯ã»ã¹ã¬ãã«ã®äžäžèŽ) ãšãããŸããããã®ä»ã®ãã£ãŒã«ãã§ç°ãªãç¹åŸŽãèŠåããããŸãã { " protoPayload ": { " @type ": " type.googleapis.com/google.cloud.audit.AuditLog ", " status ": { " code ": 7 , " message ": " (Dry Run Mode) Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier: RmvvqAujYKJhXMxPzN-bkSzBmHGRHuIXUXvLuvR8Gbh_ZZYCtEFOlQ ", " details ": [ { " @type ": " type.googleapis.com/google.rpc.PreconditionFailure ", " violations ": [ { " type ": " VPC_SERVICE_CONTROLS ", " description ": " RmvvqAujYKJhXMxPzN-bkSzBmHGRHuIXUXvLuvR8Gbh_ZZYCtEFOlQ " } ] } ] } , " authenticationInfo ": { " principalEmail ": " service-222222222222@gcp-sa-logging.iam.gserviceaccount.com " } , " requestMetadata ": { " callerIp ": " private ", " requestAttributes ": {} , " destinationAttributes ": {} } , " serviceName ": " bigquery.googleapis.com ", " methodName ": " google.cloud.bigquery.v2.TableDataService.InsertAll ", " resourceName ": " projects/111111111111 ", " metadata ": { " @type ": " type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata ", " ingressViolations ": [ { " servicePerimeter ": " accessPolicies/596827900003/servicePerimeters/test ", " targetResource ": " projects/111111111111 " } ] , " dryRun ": true , " resourceNames ": [ " yutakei-test-prj ", " projects/222222222222 " ] , " securityPolicyInfo ": { " servicePerimeterName ": " accessPolicies/596827900003/servicePerimeters/test ", " organizationId ": " 333333333333 " } , " vpcServiceControlsUniqueId ": " RmvvqAujYKJhXMxPzN-bkSzBmHGRHuIXUXvLuvR8Gbh_ZZYCtEFOlQ ", " violationReason ": " NO_MATCHING_ACCESS_LEVEL ", " deviceState ": " Unknown " } } , " insertId ": " 3vwwvwd2hpq ", " resource ": { " type ": " audited_resource ", " labels ": { " service ": " bigquery.googleapis.com ", " method ": " google.cloud.bigquery.v2.TableDataService.InsertAll ", " project_id ": " yutakei-test-prj " } } , " timestamp ": " 2024-02-20T13:09:17.367737498Z ", " severity ": " ERROR ", " logName ": " projects/yutakei-test-prj/logs/cloudaudit.googleapis.com%2Fpolicy ", " receiveTimestamp ": " 2024-02-20T13:09:18.644856847Z " } è©³çŽ°ç¢ºèª ãã®1 20è¡ç®ã® principalEmail (åŒã³åºãå
ã¢ã«ãŠã³ãã® Email) ã確èªãããšãGoogle ã¢ã«ãŠã³ãã§ã¯ãªã ãµãŒãã¹ã¢ã«ãŠã³ã ã§ããããšãããããŸãã ãµãŒãã¹ã¢ã«ãŠã³ãã®ã¡ãŒã«ã¢ãã¬ã¹ã¯ã ã@以åã«ãããžã§ã¯ã IDã@以åŸã«ãµãŒãã¹åã ãå«ãŸããŠããŸãã ãã®ããšããã ã projects/2222222222222 ã®äœããã®ãã°ã·ã³ã¯ãã projects/111111111111 ã® BigQuery API ã«ã¢ã¯ã»ã¹ããŠããã å¯èœæ§ãèããããŸãã åèïŒ æžã蟌㿠ID (ãã°ã·ã³ã¯ã®ãµãŒãã¹ã¢ã«ãŠã³ã) è©³çŽ°ç¢ºèª ãã®2 VPC Service Controls ã«ã¯ãã©ãã«ã·ã¥ãŒãã£ã³ã°ããŒã«ããããŸãã 47è¡ç®ã® vpcServiceControlsUniqueId (åéåã«ä»äžãããäžæã®èå¥å) ã«èšèŒã® ID ã VPC Service Controls ã®ãã©ãã«ã·ã¥ãŒãã£ã³ã°ããŒã«ã«å
¥åããããšã§ããšã©ãŒåå ãå¯èŠåããŠåæã§ããŸãã åèïŒ VPC Service Controls ã®ãã©ãã«ã·ã¥ãŒãã£ã³ã°ãžã®ã¢ã¯ã»ã¹ 以äžã¯ãã°ã«èšé²ãããŠãããŠããŒã¯ ID RmvvqAujYKJhXMxPzN-bkSzBmHGRHuIXUXvLuvR8Gbh_ZZYCtEFOlQ ãå
¥åããéã®ç»é¢ã§ãã ãã©ãã«ã·ã¥ãŒãã£ã³ã°ããŒã«ãããåæå¯èœ åè¿°åæ§ãä»ãããžã§ã¯ãã§èšå®ããããã°ã·ã³ã¯ãåœãããžã§ã¯ãã® BigQuery API ã«å¯ŸããŠãã°ããšã¯ã¹ããŒãããŠããããšãæšæž¬ã§ããŸãã èå¯ãšå¯Ÿå¿ ãããŸã§ã®çµæãããåœåã®æ§æã§ã¯äžååã§ããããšãè©äŸ¡ã®éçšã§å€æããŸããã®ã§å®æ
ã«åãããŠå¢çèšå®ãä¿®æ£ããŸãã è©äŸ¡ã®éçšã§å€æãã宿
ã«åãããŠãµãŒãã¹å¢çãä¿®æ£ãã äžã (å
åã) ããªã·ãŒ ã§ä»¥äžã®ããã«ã«ãŒã«ã远å ããŠèšå®ãä¿åããŸãã ããã«ãããInbound æ¹åã§ä»ãããžã§ã¯ãã®ãµãŒãã¹ã¢ã«ãŠã³ããåœãããžã§ã¯ãã®ãµãŒãã¹å¢çå
ã«ãã BigQuery API ã«ã¢ã¯ã»ã¹ã§ããããã«ãªããŸãã åèïŒ äžãïŒå
åãïŒã«ãŒã«ã®ãªãã¡ã¬ã³ã¹ # 屿§ é
ç® èšå®å€ 1 FROM ID ä»ãããžã§ã¯ãã®ãã°ã·ã³ã¯ãµãŒãã¹ã¢ã«ãŠã³ã 2 FROM ãœãŒã¹ ãã¹ãŠã®ãœãŒã¹ 3 TO ãããžã§ã¯ã åœãããžã§ã¯ã 4 TO ãµãŒãã¹ BigQuery API (All methods) äžã (å
åã) ããªã·ãŒã®èšå® ãµãŒãã¹å¢çä¿®æ£åŸããšã©ãŒãã°ã¯ãã¹ãŠæœ°ã蟌ãããšãã§ããŸããã æåŸã« VPC Service Controls ã¯ã»ãã¥ãªãã£ã匷åºã«ããŠãããåé¢ãæœåšçãªäžåã«æ°ã¥ãã¬ãŸãŸå¢çãé©çšããŠããŸããšãµãŒãã¹ã«åœ±é¿ãäžããŠããŸããŸãã é©çšåã«ã¯ãã©ã€ã©ã³ã¢ãŒãã§èšå®ãè©äŸ¡ããå®éã®ãµãŒãã¹ã«ã©ã®ãããªåœ±é¿ãããããäºåã«ç¢ºèªããããšãéèŠã§ãã åœèšäºã VPC Service Controls ã®é©åãªéçšã®äžå©ã«ãªãã°å¹žãã§ãã é¢é£èšäº ãã®ä» VPC Service Controls é¢é£èšäºã«ã€ããŠã¯ä»¥äžãåç
§ãã ããã blog.g-gen.co.jp æŠäº ç¥ä» (èšäºäžèЧ) 2022幎4æã«ãžã§ã€ã³ãã¯ã©ãŠããœãªã¥ãŒã·ã§ã³éšæå±ãG-genå¯äžã®å±±æ¢šçåšäœãšã³ãžã㢠Google Cloud Partner Top Engineer 2024 ã«éžåºãIaC ã CI/CD åšãã®ãµãŒãã¹ããããã¯ããèå³åéã§ãã è¶£å³ã¯ããŒããã€ã¯ãããŒãã¬ãŒã¹ããµãã«ãŒèгæŠã§ãã Follow @ggenyutakei