Beveilig je Redis, memcached, ElasticSearch, MongoDB, ...
SBij hedendaagse, moderne development projecten wordt tegenwoordig een veel uitgebreidere stack ingezet dan voorheen. Waar we 'vroeger' volstonden met Apache, MySQL en [vul hier je favoriete programmeertaal in], hebben we tegenwoordig keuze uit veel meer additionele software. Bijvoorbeeld services als Redis en memcached voor caching van sessies en applicatiedata. MongoDB en andere NoSQL databases voor zeer snelle toegang tot grote hoeveelheden data. En Elasticsearch als supersnelle index database voor geavanceerde zoekfuncties.
Het wordt je zelfs zo eenvoudig gemaakt dat je op Linux deze services snel en eenvoudig kan installeren en starten. Met yum of apt-get heb je binnen een paar minuten zo'n service aan de praat en via een web panel is het vaak maar een kwestie van aanklikken.
Het vervelende daarbij is dat deze services bij een standaard installatie nog niet secure zijn. In de documentatie van Redis is bijvoorbeeld deze tekst opgenomen over security:
..., in general, untrusted access to Redis should always be mediated by a layer implementing ACLs, validating user input, and deciding what operations to perform against the Redis instance. In general, Redis is not optimized for maximum security but for maximum performance and simplicity.
Deze uitspraak is in de regel geldig op alle hierboven genoemde services en vele anderen.
Als je deze services gebruikt op een server die direct aan het internet gekoppeld is, wat bij een webserver meestal het geval is, dan kan na een kale installatie de toegang tot de service dus wel heel erg open staan. Dat kan leiden tot ongeoorloofde toegang tot je data, dataverlies of datacorruptie. En in extreme gevallen zelfs tot het hacken van je server. De afgelopen jaren zijn een aantal van dit soort services misbruikt om een botnet mee te creeren. Iets dat je niet moet willen laten gebeuren met jouw servers!
Er zijn goede oplossingen om deze services wel secure te maken. Die oplossingen worden het best in meerdere lagen uitgevoerd. Voorbeelden van dit soort maatregelen zijn:
- het beperken van de toegang tot de service in de firewall, tot bekende IP adressen waarvan bekend is dat die toegang nodig hebben;
- het gebruiken van andere poorten dan de default poortnummers;
- de toegang tot de service laten verlopen via een reverse proxy, die tevens gebruik maakt van certificaten om het verkeer tussen je applicatie en de service te encrypten;
- in de reverse proxy of rechtstreeks in de service gebruik maken van wachtwoorden;
- in de reverse proxy gebruik maken van modules die de aard van de requests controleren en deze blokkeren bij onverwacht of niet toegestaan gedrag;
- gevaarlijke commando's uitzetten of hernoemen;