├── Apps Script ├── getIPGeo.gs ├── suspicious_logins.gs └── version_monit_public.gs ├── asset_inventory ├── 01_GCP_VM.gs ├── 02_GCP_GKE.gs └── main.gs ├── compute_engine_vulnerabilities_management ├── 01_enumerate_vms.sh ├── 02_enumerate_vulns.sh └── 03_list_vms_with_fixes_available.sh ├── gcp_org_policy ├── all_projects_policies.sh └── org_all_folders_policies.sh ├── list_all_ip_all_projects_also_not_active.sh ├── list_fw_rules_all_projects.sh ├── list_private_ip_all_projects.sh ├── list_public_ip_all_projects.sh ├── list_roles.sh ├── list_roles_for_user.sh ├── list_users_all_roles_per_project.sh ├── list_users_for_role.sh ├── service_accounts_with_keys.sh ├── service_accounts_with_roles.sh ├── shared_outside_organization.gs └── teamdrive_enum.gs /Apps Script/getIPGeo.gs: -------------------------------------------------------------------------------- 1 | function getIpGeolocationData(ip = "", returnType = "") { 2 | try { 3 | ipData = isBlank(ip) 4 | ? getResponseJsonData("https://api.ipbase.com/v2/info") 5 | : getResponseJsonData("https://api.ipbase.com/v2/info?ip=" + ip); 6 | } catch (error) { 7 | return "Request error"; 8 | } 9 | 10 | if (isBlank(ipData)) return "Response error"; 11 | 12 | let locationData; 13 | 14 | switch (returnType.toUpperCase()) { 15 | case "CITY": 16 | locationData = ipData["city"]; 17 | break; 18 | 19 | case "COUNTRY": 20 | locationData = ipData["country_name"]; 21 | break; 22 | 23 | default: 24 | var datas = ipData["data"]; 25 | var locations = datas["location"]; 26 | var cities = locations["city"]; 27 | 28 | var conutries = locations["country"]; 29 | var continents = locations["continent"]; 30 | 31 | locationData = 32 | cities.name + 33 | ", " + 34 | conutries.alpha2 + 35 | ", " + 36 | conutries.name + 37 | ", " + 38 | continents.name; 39 | 40 | break; 41 | } 42 | 43 | return locationData; 44 | } 45 | function getResponseJsonData(url) { 46 | if (isBlank(url)) return; 47 | 48 | let response = UrlFetchApp.fetch(url, { 49 | headers: { 50 | apikey: APIKEY, 51 | }, 52 | }); 53 | 54 | let json = response.getContentText(); 55 | 56 | return JSON.parse(json); 57 | } 58 | function isBlank(str) { 59 | return !str || /^\s*$/.test(str); 60 | } 61 | 62 | -------------------------------------------------------------------------------- /Apps Script/suspicious_logins.gs: -------------------------------------------------------------------------------- 1 | function Logins(starts, ends) { 2 | var pageToken, responseX; 3 | var userKey = "all"; 4 | var applicationName = "login"; 5 | var table = []; 6 | 7 | do { 8 | var optionalArgs = { 9 | maxResults: 20, 10 | startTime: starts, 11 | endTime: ends, 12 | pageToken: pageToken, 13 | }; 14 | responseX = AdminReports.Activities.list( 15 | userKey, 16 | applicationName, 17 | optionalArgs 18 | ); 19 | var activities = responseX.items; 20 | if (activities && activities.length > 0) { 21 | for (i = 0; i < activities.length; i++) { 22 | var activity = activities[i]; 23 | if ( 24 | activity.events[0].name == "login_failure" || 25 | activity.events[0].name == "login_success" 26 | ) 27 | table.push([ 28 | activity.actor.email, 29 | activity.events[0].name, 30 | activity.id.time, 31 | activity.ipAddress, 32 | ]); 33 | } 34 | } else { 35 | Logger.log("No logins found."); 36 | } 37 | 38 | pageToken = responseX.nextPageToken; 39 | } while (pageToken); 40 | 41 | return table; 42 | } 43 | -------------------------------------------------------------------------------- /Apps Script/version_monit_public.gs: -------------------------------------------------------------------------------- 1 | function main_version_monitor() { 2 | //main function to check OS version 3 | 4 | var dates = read_dates(); //read dates of last script execution and write current date of execution 5 | var entries_to_monitor2 = read_events(dates[1][0], dates[0][0]); //call function of reading events from gsuite 6 | 7 | var ntablica2 = []; 8 | 9 | for (uio2 = 0; uio2 < entries_to_monitor2.length; uio2++) { 10 | Logger.log(entries_to_monitor2[uio2]); 11 | if (entries_to_monitor2[uio2][6] != "unknown") 12 | ntablica2.push([ 13 | entries_to_monitor2[uio2][0], 14 | entries_to_monitor2[uio2][4], 15 | entries_to_monitor2[uio2][6], 16 | entries_to_monitor2[uio2][3], 17 | ]); 18 | } 19 | 20 | var size_table = ntablica2.length; 21 | if (size_table > 0) { 22 | for (var uuz = 0; uuz < size_table; uuz++) { 23 | var result_of_check = compare_version_v2(ntablica2[uuz][2]); 24 | 25 | if (result_of_check == false) { 26 | var iOS_text = 27 | "iOS: https://support.apple.com/en-us/HT204204#:~:text=Go%20to%20Settings%20%3E%20General%20%3E%20Software,version%20of%20iOS%20or%20iPadOS."; 28 | var macOS_text = ""; 29 | var android_text = 30 | "Android information about update procedure: https://support.google.com/android/answer/7680439?hl=en"; 31 | var windows = ""; 32 | var linux = ""; 33 | 34 | var text_do = "Hello " + ntablica2[uuz][0] + "
"; 35 | var content = 36 | '
Please update your operating system: ' + 37 | ntablica2[uuz][2] + 38 | " to the latest version.

"; 39 | var endend = ""; 40 | 41 | var android2 = 42 | "
Your Android device has not been updated for at least 150 days....

"; 43 | 44 | var full_text = text_do + content; 45 | var full_text2 = text_do + content; 46 | 47 | if (ntablica2[uuz][1] == "WINDOWS" || ntablica2[uuz][1] == "LINUX") { 48 | Logger.log(""); 49 | //other script is called. 50 | } else { 51 | if (ntablica2[uuz][1] == "MAC") { 52 | MailApp.sendEmail( 53 | ntablica2[uuz][0], 54 | "[Action required] Update MacOS device", 55 | "", 56 | { 57 | htmlBody: full_text + macOS_text + endend, 58 | noReply: true, 59 | } 60 | ); 61 | } 62 | 63 | if (ntablica2[uuz][1] == "iOS") { 64 | MailApp.sendEmail( 65 | ntablica2[uuz][0], 66 | "[Action required] Update iOS device", 67 | "", 68 | { 69 | htmlBody: full_text + iOS_text + endend, 70 | noReply: true, 71 | } 72 | ); 73 | } 74 | 75 | if (ntablica2[uuz][1] == "ANDROID") { 76 | if (check_android_patch_date(ntablica2[uuz][3]) == true) 77 | MailApp.sendEmail( 78 | ntablica2[uuz][0], 79 | "[Action required] Update Android device.", 80 | "", 81 | { 82 | htmlBody: full_text + android2 + android_text + endend, 83 | noReply: true, 84 | } 85 | ); 86 | } 87 | } 88 | } 89 | } //end of for 90 | } //end of IF 91 | } 92 | 93 | function check_android_patch_date(serial_value) { 94 | var mobiles_db = open_spreadsheet_file("", ""); 95 | var result_check = 0; 96 | for (var countx2 = 0; countx2 < mobiles_db.length; countx2++) { 97 | if (mobiles_db[countx2][7] == serial_value) { 98 | //serial or device id 99 | result_check = old_update(mobiles_db[countx2][5]); 100 | if (result_check == true) { 101 | return true; 102 | } 103 | if (result_check == false) { 104 | return false; 105 | } 106 | } 107 | } 108 | } 109 | 110 | function old_update(epoch1) { 111 | const MILLIS_PER_DAY = 1000 * 60 * 60 * 24; 112 | 113 | var datenew = new Date(); 114 | 115 | if (datenew.getTime() / MILLIS_PER_DAY - epoch1 / MILLIS_PER_DAY > 150) { 116 | //update older than 150 days 117 | return true; 118 | } else { 119 | return false; 120 | } 121 | } 122 | 123 | function compare_version_v2(version_to_check) { 124 | var handler_to_file = open_spreadsheet_file("", "supported versions"); 125 | 126 | for (var zmx = 1; zmx < handler_to_file[10].length; zmx++) { 127 | if (handler_to_file[10][zmx] == version_to_check) return true; 128 | } 129 | 130 | return false; 131 | } 132 | 133 | function update_mobile_devices_ios_android() { 134 | //dump all mobile devices 135 | 136 | customerId = ""; 137 | var pageToken; 138 | var Device_compliance_file = ""; 139 | 140 | var handler2 = SpreadsheetApp.openById(""); 141 | var tab_devices = handler2.getSheetByName(""); 142 | 143 | var dane_device = []; 144 | 145 | do { 146 | var page = AdminDirectory.Mobiledevices.list(customerId, { 147 | orderBy: "EMAIL", 148 | maxResults: 20, 149 | pageToken: pageToken, 150 | }); 151 | 152 | var device_temp = page.mobiledevices; 153 | var size_devices = device_temp.length; 154 | for ( 155 | var number_devices = 0; 156 | number_devices < size_devices; 157 | number_devices++ 158 | ) { 159 | dane_device.push([ 160 | device_temp[number_devices].email, 161 | device_temp[number_devices].status, 162 | device_temp[number_devices].model, 163 | device_temp[number_devices].os, 164 | device_temp[number_devices].type, 165 | device_temp[number_devices].securityPatchLevel, 166 | device_temp[number_devices].deviceId, 167 | device_temp[number_devices].serialNumber, 168 | device_temp[number_devices].resourceId, 169 | device_temp[number_devices].deviceCompromisedStatus, 170 | device_temp[number_devices].buildNumber, 171 | device_temp[number_devices].manufacturer, 172 | device_temp[number_devices].releaseVersion, 173 | device_temp[number_devices].hardware, 174 | device_temp[number_devices].encryptionStatus, 175 | device_temp[number_devices].devicePasswordStatus, 176 | device_temp[number_devices].managedAccountIsOnOwnerProfile, 177 | device_temp[number_devices].userAgent, 178 | ]); 179 | } 180 | 181 | pageToken = page.nextPageToken; 182 | } while (pageToken); 183 | 184 | tab_devices.getDataRange().clear(); 185 | tab_devices 186 | .getRange(1, 1, dane_device.length, dane_device[0].length) 187 | .setValues(dane_device); 188 | } 189 | 190 | function read_events(sdate, edate) { 191 | var start_data = sdate; 192 | var end_data = edate; 193 | 194 | var userKeyA = "all"; 195 | var applicationNameA = "mobile"; 196 | var pageToken, response; 197 | var table_mobile = []; 198 | 199 | do { 200 | var optionalArgsA = { 201 | maxResults: 20, 202 | startTime: start_data, 203 | endTime: end_data, 204 | pageToken: pageToken, 205 | }; 206 | try { 207 | response = AdminReports.Activities.list( 208 | userKeyA, 209 | applicationNameA, 210 | optionalArgsA 211 | ); 212 | } catch (error) { 213 | Logger.log(error); 214 | } 215 | 216 | var abcdef = response.items; 217 | 218 | if (abcdef && abcdef.length > 0) { 219 | for (var zm2 = 0; zm2 < abcdef.length; zm2++) { 220 | var event_temp = abcdef[zm2]; 221 | var device_type_vod, device_model_vod, os_version_vod, serial_id_vod; 222 | os_version_vod = "unknown"; 223 | for (var zm3 = 0; zm3 < event_temp.events.length; zm3++) { 224 | var params_event = event_temp.events[zm3].parameters; 225 | 226 | for (var zm4 = 0; zm4 < params_event.length; zm4++) { 227 | if (params_event[zm4].name == "DEVICE_TYPE") 228 | device_type_vod = params_event[zm4].value; 229 | if (params_event[zm4].name == "DEVICE_MODEL") 230 | device_model_vod = params_event[zm4].value; 231 | if (params_event[zm4].name == "OS_VERSION") 232 | os_version_vod = params_event[zm4].value; 233 | if (params_event[zm4].name == "SERIAL_NUMBER") 234 | //we can also use device_id. 235 | serial_id_vod = params_event[zm4].value; 236 | } 237 | } 238 | table_mobile.push([ 239 | event_temp.actor.email, 240 | event_temp.actor.callerType, 241 | event_temp.id.time, 242 | serial_id_vod, 243 | device_type_vod, 244 | device_model_vod, 245 | os_version_vod, 246 | ]); 247 | } 248 | } 249 | pageToken = response.nextPageToken; 250 | } while (pageToken); 251 | return table_mobile; 252 | } 253 | 254 | function read_dates() { 255 | var handX2 = open_spreadsheet_file("", ""); 256 | 257 | var now2 = new Date(); 258 | now2.getTime(); 259 | var new_endTime112 = now2.toISOString(); 260 | 261 | var start_2 = handX2[0][0]; 262 | var ret_tab = []; 263 | 264 | ret_tab.push([new_endTime112, "Last Exec Time"]); 265 | ret_tab.push([start_2, "start"]); 266 | 267 | handX2.getRange(1, 1).setValue(new_endTime112); // 268 | 269 | return ret_tab; 270 | } 271 | 272 | -------------------------------------------------------------------------------- /asset_inventory/01_GCP_VM.gs: -------------------------------------------------------------------------------- 1 | function vms_inventory_main(){ 2 | 3 | var pageToken = 0; 4 | var table_with_vms = []; 5 | var date_of_scan_vms = Utilities.formatDate(new Date(), "GMT+2", "dd/MM/yyyy"); 6 | 7 | do { 8 | const payload = { 9 | method: "GET", 10 | contentType: 'application/json', 11 | muteHttpExceptions: true, 12 | requestedPolicyVersion: 3, 13 | headers: { 14 | Authorization: 'Bearer ' + getAccessToken() 15 | }}; 16 | 17 | var url_request = "https://cloudasset.googleapis.com/v1/organizations/"+GCP_Org_ID+"/:searchAllResources?assetTypes=compute.googleapis.com/Instance&readMask=additionalAttributes,displayName,createTime,state,parentFullResourceName,labels"; 18 | 19 | if (pageToken != 0){ 20 | url_request = url_request + "&pageToken=" + pageToken; 21 | } 22 | 23 | var pageX2 = JSON.parse(UrlFetchApp.fetch(url_request,payload).getContentText()); 24 | let result4 = pageX2.results; 25 | 26 | if (result4 && result4.length > 0) { 27 | for(zm4 = 0; zm4 < result4.length; zm4++){ 28 | //part related to prepare name of project 29 | var minBoundary2 = "projects/"; 30 | var min2 = result4[zm4].parentFullResourceName.indexOf(minBoundary2) + minBoundary2.length; 31 | var max2 = result4[zm4].parentFullResourceName.length; 32 | var name_of_project = result4[zm4].parentFullResourceName.substring(min2,max2); 33 | //name of VM 34 | let name_of_vm = result4[zm4].displayName; 35 | //part related to labels 36 | var env_data = "" 37 | if(result4[zm4].labels) 38 | { 39 | if(result4[zm4].labels.environment) 40 | env_data = result4[zm4].labels.environment; //label env 41 | if(result4[zm4].labels.env) 42 | env_data = result4[zm4].labels.env; //label env 43 | } 44 | //part related to vulerabilities 45 | 46 | if(result4[zm4].state != "TERMINATED"){ 47 | table_with_vms.push([name_of_vm, result4[zm4].additionalAttributes.osLongName, result4[zm4].additionalAttributes.osShortName , name_of_project ,result4[zm4].createTime, result4[zm4].additionalAttributes.externalIPs,result4[zm4].additionalAttributes.internalIPs, date_of_scan_vms, env_data]); 48 | } 49 | } 50 | 51 | } 52 | pageToken = pageX2.nextPageToken; 53 | } while(pageToken) 54 | 55 | var handler02 = SpreadsheetApp.openById(Cache_DB); 56 | var tab_for_all_vms = handler02.getSheetByName("COMPUTE_ENGINES"); 57 | tab_for_all_vms.clear(); 58 | 59 | if(table_with_vms.length > 0){ 60 | tab_for_all_vms.getRange(1, 1, table_with_vms.length, table_with_vms[0].length).setValues(table_with_vms); 61 | } 62 | 63 | } 64 | 65 | 66 | function run_scheduled_scan_vm_asset_inventory(){ 67 | 68 | var loaded_vm_table = open_spreadsheet_tab(Cache_DB, "COMPUTE_ENGINES"); 69 | 70 | for(var counter_02 = 0; counter_02 < loaded_vm_table.length; counter_02++){ 71 | 72 | var vm_name = loaded_vm_table[counter_02][0].toString(); 73 | var date_of_scan = loaded_vm_table[counter_02][7]; 74 | var label_product_name = loaded_vm_table[counter_02][8].toString(); 75 | var project__name = loaded_vm_table[counter_02][3].toString(); 76 | var os_type = loaded_vm_table[counter_02][1]; 77 | var external_ip = loaded_vm_table[counter_02][5]; 78 | var internal_ip = loaded_vm_table[counter_02][6]; 79 | 80 | 81 | //load file 82 | //check and save or only update 83 | //var inventory_db_file = open_spreadsheet_tab(Inventory_DB,"GKE_ASSETS") 84 | 85 | var inventory_db_file = SpreadsheetApp.openById(Inventory_DB); 86 | var inventory_db_file_tab = inventory_db_file.getSheetByName("COMPUTE_ENGINES"); 87 | var inventory_db_file_tab_data = inventory_db_file_tab.getDataRange().getValues(); 88 | //Logger.log("load Inventory_DB") 89 | //Logger.log(inventory_db_file_tab_data.length) 90 | var flag_update_only = 0; 91 | 92 | 93 | for (var counter_03 = 0; counter_03< inventory_db_file_tab_data.length; counter_03++){ 94 | 95 | var vm_name_1 = inventory_db_file_tab_data[counter_03][0]; 96 | 97 | if(vm_name == vm_name_1) 98 | { 99 | flag_update_only=1; 100 | break; 101 | } 102 | 103 | 104 | } 105 | if(flag_update_only==0){ 106 | inventory_db_file_tab.appendRow([vm_name,,project__name,date_of_scan,,label_product_name,,,,,,,,,os_type,internal_ip,external_ip]); 107 | } 108 | 109 | if(flag_update_only==1){ 110 | inventory_db_file_tab.getRange((counter_03+1),4).setValue(date_of_scan) 111 | inventory_db_file_tab.getRange((counter_03+1),3).setValue(project__name) 112 | inventory_db_file_tab.getRange((counter_03+1),6).setValue(label_product_name) 113 | inventory_db_file_tab.getRange((counter_03+1),15).setValue(os_type) 114 | inventory_db_file_tab.getRange((counter_03+1),16).setValue(internal_ip) 115 | inventory_db_file_tab.getRange((counter_03+1),17).setValue(external_ip) 116 | 117 | } 118 | 119 | } 120 | 121 | 122 | } 123 | -------------------------------------------------------------------------------- /asset_inventory/02_GCP_GKE.gs: -------------------------------------------------------------------------------- 1 | 2 | function gke_inventory_main(){ 3 | 4 | for (var counter = 0; counter < config_scope.length; counter++) 5 | { 6 | //Asset inventory for GKE Cluster 7 | if(config_scope[counter] == "GKE_CLUSTERS") { 8 | Logger.log("GKE_CLUSTERS is RUNNING") 9 | var gke_cluster_list = open_spreadsheet_tab(Cache_DB, "GKE_Clusters") 10 | 11 | for (var zmienna = 0; zmienna> all_vms.txt 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /compute_engine_vulnerabilities_management/02_enumerate_vulns.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | #MB2024 3 | 4 | current_date=$(date +"%Y-%m-%d") 5 | file_name="_list_of_vms_and_vulns.csv" 6 | file_name_errors="_list_of_vms_without_osconfig.csv" 7 | 8 | handle_error(){ 9 | echo "error" 10 | echo "$vm_name,$vm_project" >> "${current_date}${file_name_errors}" 11 | } 12 | 13 | trap 'handle_error' ERR 14 | 15 | while IFS= read -r line; do 16 | # echo "$line" 17 | vm_name=$(echo "$line" | awk '{print $1}') 18 | vm_id=$(echo "$line" | awk '{print $2}') 19 | vm_location=$(echo "$line" | awk '{print $3}') 20 | vm_project_long=$(echo "$line" | awk '{print $4}') 21 | 22 | vm_project="${vm_project_long##*/}" 23 | 24 | echo "$vm_name $vm_project" 25 | 26 | DETAILS=$(gcloud compute os-config vulnerability-reports describe "$vm_name" --location="$vm_location" --project="$vm_project" --flatten="vulnerabilities[]" --format="csv[no-heading](vulnerabilities.details.cve,vulnerabilities.details.severity,vulnerabilities.details.cvssV3.baseScore,vulnerabilities.createTime,vulnerabilities.updateTime,vulnerabilities.details.cvssV3.attackVector,vulnerabilities.details.cvssV3.attackComplexity,vulnerabilities.details.cvssV3.privilegesRequired,vulnerabilities.details.references.url,vulnerabilities.installedInventoryItemIds,vulnerabilities.items[0].upstreamFix)") 27 | if [ ! -z "$DETAILS" ]; then 28 | 29 | while IFS= read -r line3; do 30 | FINAL3="$vm_name,$vm_project,$line3" 31 | echo "$FINAL3" >> "${current_date}${file_name}" 32 | done <<< "$DETAILS" 33 | 34 | fi 35 | 36 | 37 | done < all_vms.txt 38 | rm current_vms_with_vulns.csv 39 | cp "${current_date}${file_name}" current_vms_with_vulns.csv 40 | -------------------------------------------------------------------------------- /compute_engine_vulnerabilities_management/03_list_vms_with_fixes_available.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | #MB2024 3 | 4 | current_date=$(date +"%Y-%m-%d") 5 | file_name="_vulns_with_fixes" 6 | 7 | while IFS= read -r line; do 8 | # echo "$line" 9 | fix=$(echo "$line" | cut -d ',' -f 13) 10 | if [ ! -z "$fix" ]; then 11 | echo "$line" >> "${current_date}${file_name}" 12 | fi 13 | 14 | 15 | done < $1 16 | rm current_vulns_with_fixes.csv 17 | cp "${current_date}${file_name}" current_vulns_with_fixes.csv 18 | -------------------------------------------------------------------------------- /gcp_org_policy/all_projects_policies.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | #mb2023 3 | 4 | ORG_ID=$(gcloud organizations list --format 'value(ID)') 5 | 6 | for project in $(gcloud asset search-all-resources --scope organizations/$ORG_ID --asset-types='cloudresourcemanager.googleapis.com/Project' --format='value(name.basename())') 7 | do 8 | echo "Org policies for $project" 9 | for constraint in $(gcloud resource-manager org-policies list --project=$project --format='value(constraint.basename())') 10 | do 11 | gcloud alpha resource-manager org-policies describe $constraint --project=$project --effective 12 | done 13 | echo "------" 14 | done 15 | -------------------------------------------------------------------------------- /gcp_org_policy/org_all_folders_policies.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | #mb2023 3 | 4 | ORG_ID=$(gcloud organizations list --format 'value(ID)') 5 | echo "$ORG_ID" 6 | 7 | for constraint in $(gcloud resource-manager org-policies list --organization $ORG_ID --format='value(constraint.basename())') 8 | do 9 | gcloud resource-manager org-policies describe $constraint --organization $ORG_ID 10 | done 11 | 12 | list_subfolders() { 13 | 14 | local parent_folder=$1 15 | local folders 16 | 17 | # List folders directly under the parent folder 18 | folders=$(gcloud resource-manager folders list --folder="$parent_folder" --format="value(name)") 19 | for folder in $folders; do 20 | TARGET_FOLDERS+="$folder;" 21 | # Recursively list subfolders 22 | list_subfolders "$folder" 23 | done 24 | } 25 | 26 | folders_id+=$(gcloud resource-manager folders list --organization=$ORG_ID --format="value(name)") 27 | 28 | for folderx in $folders_id; do 29 | TARGET_FOLDERS+="$folderx;" 30 | list_subfolders "$folderx" 31 | done 32 | 33 | delimeter=";" 34 | values_final=() 35 | IFS="$delimeter" 36 | read -ra values_final <<< "$TARGET_FOLDERS" 37 | 38 | for folder in ${values_final[@]}; do 39 | FOLDER=$folder 40 | echo "Org policies for $FOLDER" 41 | for constraint in $(gcloud resource-manager org-policies list --folder=$FOLDER --format='value(constraint.basename())') 42 | do 43 | gcloud resource-manager org-policies describe $constraint --folder=$FOLDER 44 | done 45 | echo "--------" 46 | done 47 | -------------------------------------------------------------------------------- /list_all_ip_all_projects_also_not_active.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | #mb 3 | for project in $(gcloud projects list --format="value(projectId)") 4 | do 5 | echo "+++++++++++++++++++ProjectID: $project ++++++++++++++++++" 6 | echo " $(gcloud compute addresses list --project $project --format="value(address)")" 7 | echo " " 8 | done 9 | #print number of projects 10 | 11 | 12 | -------------------------------------------------------------------------------- /list_fw_rules_all_projects.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | #mb 3 | for project in $(gcloud projects list --format="value(projectId)") 4 | do 5 | echo "+++++++++++++++++++ProjectID: $project ++++++++++++++++++" 6 | echo " $(gcloud compute firewall-rules list --project $project --format="table(name, network, direction, sourceRanges.list(), allowed[].map().firewall_rule().list(), disabled)")" 7 | echo " " 8 | done 9 | #print number of projects 10 | 11 | 12 | -------------------------------------------------------------------------------- /list_private_ip_all_projects.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | #mb 3 | for project in $(gcloud projects list --format="value(projectId)") 4 | do 5 | echo "+++++++++++++++++++ProjectID: $project ++++++++++++++++++" 6 | echo " $(gcloud --format="value(networkInterfaces[0].networkIP)" compute instances list --project $project)" 7 | echo " " 8 | done 9 | #print number of projects 10 | 11 | 12 | -------------------------------------------------------------------------------- /list_public_ip_all_projects.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | #mb 3 | for project in $(gcloud projects list --format="value(projectId)") 4 | do 5 | echo "+++++++++++++++++++ProjectID: $project ++++++++++++++++++" 6 | echo " $(gcloud --format="value(networkInterfaces[0].accessConfigs[0].natIP)" compute instances list --project $project)" 7 | echo " " 8 | done 9 | #print number of projects 10 | 11 | 12 | -------------------------------------------------------------------------------- /list_roles.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | gcloud iam roles list --format="table(name, description)" 3 | -------------------------------------------------------------------------------- /list_roles_for_user.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | #mariusz.burdach 2018 3 | 4 | display() { 5 | echo 6 | echo " -u, --user provide username for example -u accountname" 7 | } 8 | 9 | enumerate() { 10 | echo "Enumerating all roles for user: $1" 11 | #enumerate projects and 12 | for project in $(gcloud projects list --format="value(projectId)") 13 | do 14 | echo "+++++++++++++++++++++ Project ID $project:" 15 | for test2 in $(gcloud projects get-iam-policy $project --flatten="bindings[].members" --format="value(bindings.role)" --filter="bindings.members:$1") 16 | do 17 | if [ -z "$test2" ] 18 | then 19 | echo " no roles" 20 | else 21 | echo " $test2" 22 | fi 23 | done 24 | done 25 | 26 | } 27 | 28 | if [[ -z $1 ]] ; then 29 | display 30 | else 31 | case $1 in 32 | -u|--user) 33 | enumerate $2 34 | ;; 35 | *) 36 | display 37 | ;; 38 | esac 39 | fi 40 | 41 | -------------------------------------------------------------------------------- /list_users_all_roles_per_project.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | #mariusz.burdach 2019 3 | prefix="roles/" 4 | #gcloud projects get-iam-policy --format="table(bindings.role)" 5 | for roles in $(gcloud iam roles list --format="value(name)") 6 | do 7 | rola=${roles#"$prefix"} 8 | echo "+++++++++++++++++++++ Users with role: ${rola}" 9 | for project in $(gcloud projects list --format="value(projectId)") 10 | do 11 | echo "+++++++ Project ID $project:" 12 | for test2 in $(gcloud projects get-iam-policy $project --flatten="bindings[].members" --format="value(bindings.members)" --filter="bindings.role:${rola}") 13 | do 14 | if [ -z "$test2" ] 15 | then 16 | echo " no users" 17 | else 18 | echo " $test2 in Project ID: $project" 19 | fi 20 | done 21 | done 22 | done 23 | 24 | 25 | 26 | 27 | 28 | 29 | #gcloud projects get-iam-policy --flatten="bindings[].members" --format="table(bindings.members)" --filter="bindings.role:${arr[1]}" 30 | -------------------------------------------------------------------------------- /list_users_for_role.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | #mariusz.burdach 2018 3 | echo "Enumerating all users for role: $1" 4 | #enumerate projects and 5 | for project in $(gcloud projects list --format="value(projectId)") 6 | do 7 | echo "+++++++++++++++++++++ Project ID $project:" 8 | for test2 in $(gcloud projects get-iam-policy $project --flatten="bindings[].members" --format="value(bindings.members)" --filter="bindings.role:$1") 9 | do 10 | if [ -z "$test2" ] 11 | then 12 | echo " no users" 13 | else 14 | echo " $test2" 15 | fi 16 | done 17 | done 18 | 19 | 20 | -------------------------------------------------------------------------------- /service_accounts_with_keys.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | #mb 3 | for project in $(gcloud projects list --format="value(projectId)") 4 | do 5 | echo "ProjectId: $project" 6 | for robot in $(gcloud iam service-accounts list --project $project --format="value(email)") 7 | do 8 | echo " -> Robot $robot" 9 | for key in $(gcloud iam service-accounts keys list --iam-account $robot --project $project --format="value(name.basename())") 10 | do 11 | echo " $key" 12 | done 13 | done 14 | done 15 | -------------------------------------------------------------------------------- /service_accounts_with_roles.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | #mb 3 | #arr=() 4 | #store projectid in table 5 | for project in $(gcloud projects list --format="value(projectId)") 6 | do 7 | #arr+=($project) 8 | echo "+++++++ Project ID $project:" 9 | for test1 in $(gcloud iam service-accounts list --project $project --format="value(email)") 10 | do 11 | echo "Service account $test1 has roles: " 12 | for test2 in $(gcloud projects get-iam-policy $project --flatten="bindings[].members" --format="value(bindings.role)" --filter="bindings.members:$test1") 13 | do 14 | if [ -z "$test2" ] 15 | then 16 | echo " no roles" 17 | else 18 | echo " $test2" 19 | fi 20 | done 21 | done 22 | 23 | done 24 | #print number of projects 25 | #echo "Number of projects ${#arr[@]}" 26 | #store number of projects in file 27 | #printf "%s\n" "${arr[@]}" > project_list.txt 28 | 29 | #for i in "${arr[@]}" 30 | #do 31 | #echo $i 32 | #done 33 | -------------------------------------------------------------------------------- /shared_outside_organization.gs: -------------------------------------------------------------------------------- 1 | function enumerate_all_files(teamDriveId) { 2 | var pageToken, result, files; 3 | var test = 0; 4 | var domain = 'domain.com'; //domain name 5 | var allPermitedDomains = ["domain.com"]; //list of trusted domains 6 | 7 | do { 8 | var params = { 9 | corpora: 'teamDrive', 10 | pageToken: pageToken, 11 | maxResults: 10, 12 | useDomainAdminAccess: true, 13 | supportsTeamDrives: true, 14 | includeTeamDriveItems: true, 15 | teamDriveId: teamDriveId, 16 | } 17 | 18 | result = Drive.Files.list(params); //enumeration of all files on team drives 19 | 20 | files = result.items; 21 | 22 | 23 | for(i = 0; i < files.length; i++){ 24 | 25 | 26 | Logger.log("File name: %s", files[i].title); 27 | Logger.log("link %s", files[i].embedLink); 28 | Logger.log("mimie %s", files[i].mimeType); 29 | Logger.log("sharedUser %s", files[i].sharingUser); 30 | 31 | 32 | 33 | if(files[i].mimeType == "application/vnd.google-apps.folder") 34 | { 35 | Logger.log("folders have no share feature :("); 36 | //just folder 37 | } 38 | 39 | 40 | var perms = Drive.Permissions.list(files[i].id, {supportsTeamDrives: true}); //optional filed supportsTeamDrieves is key. we enumerate all permissions for file id. 41 | var perms_items = perms.items; 42 | for(j = 0; j < perms_items.length; j++){ 43 | 44 | if (perms_items[j].type == 'domain') 45 | { 46 | //Logger.log("Uprawnienia @%s %s %s", perms_items[j].domain, perms_items[j].role, perms_items[j].type); 47 | } 48 | else 49 | { 50 | //Logger.log("Uprawnienia %s %s %s", perms_items[j].emailAddress, perms_items[j].role, perms_items[j].type); 51 | } 52 | 53 | 54 | if (allPermitedDomains.indexOf(perms_items[j].domain) == -1) 55 | { 56 | Logger.log("Uprawnienia @%s %s %s", perms_items[j].domain, perms_items[j].role, perms_items[j].type, owner2); 57 | } 58 | 59 | } 60 | 61 | 62 | 63 | test= test+1; 64 | 65 | } 66 | pageToken = result.nextPageToken; 67 | 68 | } while(pageToken); 69 | Logger.log('Total number of files per Team Drive: %s', test); 70 | } 71 | 72 | -------------------------------------------------------------------------------- /teamdrive_enum.gs: -------------------------------------------------------------------------------- 1 | function start() 2 | { 3 | var drives2 = enum_team_drives_restrictions(); 4 | 5 | for(o=0;o< drives2.length; o++) 6 | { 7 | abc2(drives2[o]); 8 | } 9 | 10 | } 11 | 12 | 13 | function abc2(teamDriveId) 14 | { 15 | 16 | var cba = Drive.Teamdrives.get(teamDriveId, {useDomainAdminAccess: true}); 17 | Logger.log(cba.name); 18 | Logger.log(cba.id); 19 | 20 | } 21 | 22 | 23 | 24 | function enum_team_drives_restrictions() { 25 | var pageToken, page; 26 | var lista = []; 27 | 28 | do { 29 | var params = { 30 | pageToken: pageToken, 31 | maxResults: 10, 32 | useDomainAdminAccess: true, 33 | }; 34 | page = Drive.Teamdrives.list(params); 35 | var items2 = page.items; 36 | var counter = items2.length; 37 | 38 | for (i = 0; i< counter; i++) 39 | { 40 | 41 | var teamdrive = Drive.Teamdrives.get(items2[i].id, {useDomainAdminAccess: true, fields:'id, name, restrictions',}); 42 | lista.push(items2[i].id); //list of teamdrive IDs 43 | 44 | } 45 | pageToken = page.nextPageToken; 46 | } while (pageToken); 47 | 48 | Logger.log(lista); 49 | Logger.log("Number of all team drives is %s",lista.length); 50 | return lista; 51 | } 52 | 53 | 54 | 55 | 56 | --------------------------------------------------------------------------------