Node-RED/MQTT

Node-RED beveiligen

Geplaatst

Node-RED beveiligen

Standaard is de Node-RED-editor niet beveiligd – iedereen die toegang heeft tot zijn IP-adres heeft toegang tot de editor en kan wijzigingen doorvoeren.

Dit is alleen geschikt als je op een vertrouwd netwerk draait.

Deze gids beschrijft hoe u Node-RED kunt beveiligen. De beveiliging is opgesplitst in twee delen:

Editor & Admin API-beveiliging

De Editor en Admin API ondersteunen twee soorten authenticatie:

  • op gebruikersnaam / wachtwoord gebaseerde authenticatie
  • authenticatie tegen elke OAuth / OpenID-provider zoals Twitter of GitHub

Op gebruikersnaam / wachtwoord gebaseerde authenticatie

Om gebruikersauthenticatie op de Editor en Admin API in te schakelen, moet u de adminAuth eigenschap in uw instellingenbestand verwijderen :

adminAuth: {
    type: "credentials",
    users: [
        {
            username: "admin",
            password: "$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN.",
            permissions: "*"
        },
        {
            username: "george",
            password: "$2b$08$wuAqPiKJlVN27eF5qJp.RuQYuy6ZYONW7a/UWYxDTtwKFCdB8F19y",
            permissions: "read"
        }
    ]
}

De userseigenschap is een reeks gebruikersobjecten. Hiermee kunt u meerdere gebruikers definiëren, die elk verschillende rechten kunnen hebben.

Deze voorbeeldconfiguratie hierboven definieert twee gebruikers. Een belde admindie toestemming heeft om alles in de editor te doen en een wachtwoord heeft password. De ander heeft gebeld en georgekrijgt alleen-lezen toegang.

Merk op dat de wachtwoorden veilig worden gehasht met behulp van het bcrypt-algoritme.

Opmerking : in eerdere releases van Node-RED kon de instelling httpAdminAuth worden gebruikt om HTTP Basic Authentication in de editor in te schakelen. Deze optie is verouderd en mag niet worden gebruikt.
Het genereren van de wachtwoordhash

Om een ​​geschikte wachtwoord-hash te genereren, kunt u de node-red-admin opdrachtregel gebruiken. Instructies voor het installeren van de tool zijn hier beschikbaar .

node-red-admin hash-pw

De tool vraagt ​​u om het wachtwoord dat u wilt gebruiken en drukt vervolgens de hash af die naar het instellingenbestand kan worden gekopieerd.

Als alternatief kunt u de volgende opdracht uitvoeren vanuit de Node-RED-installatiemap:

node -e "console.log(require('bcryptjs').hashSync(process.argv[1], 8));" your-password-here

OAuth / OpenID-gebaseerde authenticatie

Om een ​​externe authenticatiebron te gebruiken, kan Node-RED gebruik maken van een breed scala aan strategieën die Passport biedt .

Node-RED-authenticatiemodules zijn beschikbaar voor zowel Twitter als GitHub . Ze sluiten een aantal van de strategie-specifieke details af om het gemakkelijker te gebruiken. Maar ze kunnen ook worden gebruikt als sjabloon voor authenticatie met andere vergelijkbare strategieën.

Het volgende voorbeeld laat zien hoe u kunt configureren voor authenticatie tegen Twitter zonder de auth-module te gebruiken die we bieden.

adminAuth: {
    type:"strategy",
    strategy: {
        name: "twitter",
        label: 'Sign in with Twitter',
        icon:"fa-twitter",
        strategy: require("passport-twitter").Strategy,
        options: {
            consumerKey: TWITTER_APP_CONSUMER_KEY,
            consumerSecret: TWITTER_APP_CONSUMER_SECRET,
            callbackURL: "http://example.com/auth/strategy/callback",
            verify: function(token, tokenSecret, profile, done) {
                done(null, profile);
            }
        },
    },
    users: [
       { username: "knolleary",permissions: ["*"]}
    ]
};

De strategyeigenschap heeft de volgende opties:

  • name – de naam van de paspoortstrategie die wordt gebruikt
  • strategy – de paspoortstrategiemodule
  • labelicon– gebruikt op de inlogpagina. iconkan elke FontAwesome-pictogramnaam zijn.
  • options– een optieobject dat bij het aanmaken aan de paspoortstrategie is doorgegeven. Raadpleeg de eigen documentatie van de strategie voor wat deze vereist. Zie hieronder voor een knooppunt op de callbackURL.
  • verify– de verifieerfunctie die door de strategie wordt gebruikt. Het moet aanroepen donemet een gebruikersprofiel als tweede argument als de gebruiker geldig is. Dit heeft naar verwachting een usernameeigenschap die wordt gebruikt om te vergelijken met de lijst met geldige gebruikers. Passport probeert het gebruikersprofielobject te standaardiseren, dus de meeste strategieën bieden deze eigenschap.

De callbackURLstrategie wordt gebruikt door de authenticatieleverancier om te leiden naar een autorisatiepoging. Het moet de URL zijn van uw Node-RED-editor met /auth/strategy/callbacktoevoeging aan het pad. Als u bijvoorbeeld de editor opent op http://localhost:1880, zou u gebruiken http://localhost:1880/auth/strategy/callback.

Een standaardgebruiker instellen

De voorbeeldconfiguratie hierboven verhindert dat iemand toegang krijgt tot de editor tenzij hij inlogt.

In sommige gevallen is het wenselijk om iedereen een bepaald toegangsniveau toe te staan. Dit geeft doorgaans alleen-lezen toegang tot de editor. Om dit te doen, kan de defaulteigenschap worden toegevoegd aan de adminAuthinstelling om de standaardgebruiker te definiëren:

adminAuth: {
    type: "credentials",
    users: [ /* list of users */ ],
    default: {
        permissions: "read"
    }
}

Gebruikersrechten

Vóór Node-RED 0.14 konden gebruikers een van de volgende twee machtigingen hebben:

  • * – volledige toegang
  • read – alleen-lezen toegang

Vanaf Node-RED 0.14 kunnen de permissies veel fijner zijn en om dat te ondersteunen kan de eigenschap een enkele string zijn zoals voorheen, of een array met meerdere permissies.

Elke methode van de Admin API definieert welk machtigingsniveau nodig is om er toegang toe te hebben. Het toestemmingsmodel is gebaseerd op bronnen. Om bijvoorbeeld de huidige stroomconfiguratie te krijgen, heeft een gebruiker de flows.readtoestemming nodig. Maar om de stromen bij te werken hebben ze flows.writetoestemming nodig.

Token verlopen

Toegangstokens verlopen standaard zeven dagen nadat ze zijn gemaakt. We ondersteunen momenteel geen vernieuwing van het token om deze periode te verlengen.

De vervaltijd kan worden aangepast door de sessionExpiryTimeeigenschap van de adminAuthinstelling in te stellen. Dit definieert in seconden hoe lang een token geldig is. Als u bijvoorbeeld wilt instellen dat de tokens na 1 dag verlopen:

adminAuth: {
    sessionExpiryTime: 86400,
    ...
}

Toegang tot de Admin API

Met de adminAutheigenschap ingesteld, beschrijft de Admin API-documentatie hoe u toegang krijgt tot de API.

Aangepaste gebruikersverificatie

In plaats van gebruikers hardcoderen in het instellingenbestand, is het ook mogelijk om aangepaste code aan te sluiten om gebruikers te verifiëren. Dit maakt het mogelijk om te integreren met bestaande authenticatieschema’s.

Het volgende voorbeeld laat zien hoe een externe module kan worden gebruikt om de aangepaste authenticatiecode op te geven.

  • Sla het volgende op in een bestand met de naam <node-red>/user-authentication.js
module.exports = {
   type: "credentials",
   users: function(username) {
       return new Promise(function(resolve) {
           // Do whatever work is needed to check username is a valid
           // user.
           if (valid) {
               // Resolve with the user object. It must contain
               // properties 'username' and 'permissions'
               var user = { username: "admin", permissions: "*" };
               resolve(user);
           } else {
               // Resolve with null to indicate this user does not exist
               resolve(null);
           }
       });
   },
   authenticate: function(username,password) {
       return new Promise(function(resolve) {
           // Do whatever work is needed to validate the username/password
           // combination.
           if (valid) {
               // Resolve with the user object. Equivalent to having
               // called users(username);
               var user = { username: "admin", permissions: "*" };
               resolve(user);
           } else {
               // Resolve with null to indicate the username/password pair
               // were not valid.
               resolve(null);
           }
       });
   },
   default: function() {
       return new Promise(function(resolve) {
           // Resolve with the user object for the default user.
           // If no default user exists, resolve with null.
           resolve({anonymous: true, permissions:"read"});
       });
   }
}
  • Stel de adminAutheigenschap in settings.js in om deze module te laden:
adminAuth: require("./user-authentication")

HTTP-knooppuntbeveiliging

De routes die worden weergegeven door de HTTP In-knooppunten kunnen worden beveiligd met basisverificatie.

De httpNodeAutheigenschap in uw settings.jsbestand kan worden gebruikt om één gebruikersnaam en wachtwoord te definiëren waarmee toegang tot de routes kan worden verkregen.

httpNodeAuth: {user:"user",pass:"$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN."},

De passeigenschap gebruikt hetzelfde formaat als adminAuth. Zie De wachtwoordhash genereren voor meer informatie.

Toegang tot statische inhoud die door de httpStaticeigenschap is gedefinieerd , kan worden beveiligd met de httpStaticAutheigenschap, die dezelfde indeling gebruikt.

Opmerking : in eerdere releases van Node-RED passwerd verwacht dat de eigenschap een MD5-hash zou zijn. Dit is cryptografisch onveilig, dus is vervangen door bcrypt, zoals gebruikt door adminAuth. Voor achterwaartse compatibiliteit worden MD5-hashes nog steeds ondersteund, maar ze worden niet aanbevolen.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *