Blog der Heimetli Software AG

Zugriff von Google-Apps-Script auf den Server sperren

Im Februar fing es an: anscheinend sinnlose Zugriffe auf unseren Webserver von Google-Apps-Script.

107.178.194.208 - - [12/Feb/2020:15:11:10 +0100] "GET / HTTP/1.1" 200 6664 "-" "Mozilla/5.0 (compatible; Google-Apps-Script)"
107.178.192.76 - - [12/Feb/2020:17:45:21 +0100] "GET / HTTP/1.1" 200 6664 "-" "Mozilla/5.0 (compatible; Google-Apps-Script)"
107.178.193.140 - - [12/Feb/2020:19:28:37 +0100] "GET / HTTP/1.1" 200 6664 "-" "Mozilla/5.0 (compatible; Google-Apps-Script)"
107.178.193.142 - - [12/Feb/2020:19:53:24 +0100] "GET / HTTP/1.1" 200 6664 "-" "Mozilla/5.0 (compatible; Google-Apps-Script)"
107.178.192.75 - - [13/Feb/2020:08:43:15 +0100] "GET / HTTP/1.1" 200 6664 "-" "Mozilla/5.0 (compatible; Google-Apps-Script)"
107.178.192.74 - - [13/Feb/2020:17:40:06 +0100] "GET / HTTP/1.1" 200 6664 "-" "Mozilla/5.0 (compatible; Google-Apps-Script)"
107.178.193.144 - - [19/Feb/2020:16:45:04 +0100] "GET / HTTP/1.1" 200 6662 "-" "Mozilla/5.0 (compatible; Google-Apps-Script)"
35.187.132.112 - - [20/Feb/2020:19:11:44 +0100] "GET / HTTP/1.1" 200 6662 "-" "Mozilla/5.0 (compatible; Google-Apps-Script)"
35.187.132.110 - - [20/Feb/2020:19:41:37 +0100] "GET / HTTP/1.1" 200 6662 "-" "Mozilla/5.0 (compatible; Google-Apps-Script)"
35.187.133.46 - - [20/Feb/2020:19:51:34 +0100] "GET / HTTP/1.1" 200 6662 "-" "Mozilla/5.0 (compatible; Google-Apps-Script)"
35.187.132.108 - - [20/Feb/2020:20:21:36 +0100] "GET / HTTP/1.1" 200 6662 "-" "Mozilla/5.0 (compatible; Google-Apps-Script)"
35.187.133.48 - - [20/Feb/2020:20:41:39 +0100] "GET / HTTP/1.1" 200 6662 "-" "Mozilla/5.0 (compatible; Google-Apps-Script)"
35.187.133.44 - - [20/Feb/2020:21:31:36 +0100] "GET / HTTP/1.1" 200 6662 "-" "Mozilla/5.0 (compatible; Google-Apps-Script)"
107.178.193.142 - - [21/Feb/2020:00:06:40 +0100] "GET / HTTP/1.1" 200 6662 "-" "Mozilla/5.0 (compatible; Google-Apps-Script)"

Alle 15 bis 20 Minuten, von verschiedensten IP-Adressen. Die IP-Bereiche zu sperren nützte wenig, es wurden einfach andere Adressen verwendet.

Die Suche nach einem Feedback-Formular bei Google ist ziemlich aussichtslos. Wenn es das gibt, ist es extrem gut versteckt.

Schlussendlich habe ich eine der Seiten ausgefüllt, und Google hat sogar darauf reagiert. Leider meldete sich nur ein Verkäufer der mir die Google Cloud schmackhaft machen wollte. Das Problem verstand er nicht und verwies mich wieder ins Netz.

Ohne Google-Account geht nichts bei Google, also musste ich mich registrieren um dem Cloud-Team eine Beschwerde zu schicken. Die sind angeblich nicht für die Scripts zuständig und empfahlen eine Beschwerde beim Script-Team...

Im Moment läuft dort gerade eine Reklamation, aber bisher gab es keine Reaktion darauf.

Anfang März wurde etwas umgestellt, die Zugriffe sehen jetzt anders aus:

107.178.192.75 - - [02/Mar/2020:22:16:26 +0100] "GET / HTTP/1.1" 200 6662 "-" "Mozilla/5.0 (compatible; Google-Apps-Script)"
35.187.133.48 - - [02/Mar/2020:22:48:45 +0100] "GET / HTTP/1.1" 200 6662 "-" "Mozilla/5.0 (compatible; Google-Apps-Script; beanserver; +https://script.google.com; id: UAEmdDd8cgcukbDLnQU0uRo0IqBt_iagwlw)"
107.178.192.74 - - [02/Mar/2020:23:03:51 +0100] "GET / HTTP/1.1" 200 6662 "-" "Mozilla/5.0 (compatible; Google-Apps-Script; beanserver; +https://script.google.com; id: UAEmdDd8cgcukbDLnQU0uRo0IqBt_iagwlw)"
107.178.192.76 - - [02/Mar/2020:23:13:35 +0100] "GET / HTTP/1.1" 200 6662 "-" "Mozilla/5.0 (compatible; Google-Apps-Script; beanserver; +https://script.google.com; id: UAEmdDd8cgcukbDLnQU0uRo0IqBt_iagwlw)"
107.178.192.87 - - [02/Mar/2020:23:23:45 +0100] "GET / HTTP/1.1" 200 6662 "-" "Mozilla/5.0 (compatible; Google-Apps-Script; beanserver; +https://script.google.com; id: UAEmdDd8cgcukbDLnQU0uRo0IqBt_iagwlw)"

Die Lösung

Weil von Google wahrscheinlich nie eine brauchbare Reaktion kommt, habe ich nochmals im Internet gesucht und bin auf einen interessanten Post gestossen: https://cloud.google.com/appengine/kb/#static-ip.

Dort wird beschrieben wie man die IP-Adressen der Google-Cloud findet. Die Liste der Adressen ist zu lang um sie von Hand einzugeben, und deshalb gibt es jetzt eine Pipeline die das erledigt:

nslookup -q=TXT _cloud-netblocks.googleusercontent.com 8.8.8.8 | grep -o 'include:\([^ ]*\)' | cut -c 9- | xargs -I{} nslookup -q=TXT {} 8.8.8.8 | grep -o 'ip4:\([^ ]*\)' | cut -c 5- | xargs -I{} iptables -A INPUT -s {} -j DROP

Das Script ist eigentlich recht einfach:

nslookup -q=TXT _cloud-netblocks.googleusercontent.com 8.8.8.8

Holt eine Liste mit Verweisen auf andere Listen:

Server:	8.8.8.8
Address:	8.8.8.8#53

Non-authoritative answer:
_cloud-netblocks.googleusercontent.com	text = "v=spf1 include:_cloud-netblocks1.googleusercontent.com include:_cloud-netblocks2.googleusercontent.com include:_cloud-netblocks3.googleusercontent.com include:_cloud-netblocks4.googleusercontent.com include:_cloud-netblocks5.googleusercontent.com ?all"

Authoritative answers can be found from:

Der nächste Schritt extrahiert die Einträge aus der Liste:

include:_cloud-netblocks1.googleusercontent.com
include:_cloud-netblocks2.googleusercontent.com
include:_cloud-netblocks3.googleusercontent.com
include:_cloud-netblocks4.googleusercontent.com
include:_cloud-netblocks5.googleusercontent.com

cut entfernt "include:" aus den Zeilen, so dass nur die Namen übrig bleiben. Mit Hilfe von xargs werden diese Namen wieder abgefragt:

Server:	8.8.8.8
Address:	8.8.8.8#53

Non-authoritative answer:
_cloud-netblocks1.googleusercontent.com	text = "v=spf1 include:_cloud-netblocks6.googleusercontent.com include:_cloud-netblocks7.googleusercontent.com ip6:2600:1900::/35 ip4:8.34.208.0/20 ip4:8.35.192.0/21 ip4:8.35.200.0/23 ip4:23.236.48.0/20 ip4:23.251.128.0/19 ip4:34.64.0.0/11 ip4:34.96.0.0/14 ?all"

Authoritative answers can be found from:

Server:	8.8.8.8
Address:	8.8.8.8#53

Non-authoritative answer:
_cloud-netblocks2.googleusercontent.com	text = "v=spf1 ip4:34.100.0.0/16 ip4:34.102.0.0/15 ip4:34.104.0.0/14 ip4:34.124.0.0/18 ip4:34.124.64.0/20 ip4:34.124.80.0/23 ip4:34.124.84.0/22 ip4:34.124.88.0/23 ip4:34.124.92.0/22 ip4:34.125.0.0/16 ip4:35.184.0.0/14 ip4:35.188.0.0/15 ip4:35.190.0.0/17 ?all"

.
.
.

Diese Liste wird wieder mit grep und cut bearbeitet, und schlussendlich mit xargs an iptables verfüttert um die angegebenen Adressen zu blockieren.

Ergebnis

Seit dieses Script gelaufen ist, gibt es keine Zugriffe von Google-Apps-Script auf unseren Server mehr.