How to protect the dashboard with credentials for more than 1 users?

Hi everybody.

At first: I'm new on this site. Is there a forum in german language available?

My inquiry:
I'm trying to set a username/password protection for my dashboard.
This already works for my flow-editor, but the dashboard is still without protection.

I tried to set up the ~↓/.node-red/settings.js with these changes:

    httpNodeMiddleware: function(req,res,next) {

        var basicAuth = require('basic-auth');
        var user = basicAuth(req);

        if (!user || !user.name || !user.pass) {
            res.set('WWW-Authenticate', 'Basic realm=Authorization Required');
            return res.sendStatus(401);
        }

        var users = [
            { username: 'user1', password: 'passwd1' },
            { username: 'user2', password: 'passwd2' },
            { username: 'user3', password: 'passwd3' },
            { username: 'user4', password: 'passwd4' },
        ];

        var isValid = users.some(function(u) {
            return u.username === user.name && u.password === user.pass;
        });

        if (isValid) {
            return next();
        } else {
            res.set('WWW-Authenticate', 'Basic realm=Authorization Required');
            return res.sendStatus(401);
        }
    },

But my site http://xx.xxx.xx.xxx:1880/ui ist still adressable without a login prompt.
(Link removed)

What did I do wrong?

PS: httpNodeAuth is already disabled.

    /** To password protect the node-defined HTTP endpoints (httpNodeRoot),
     * including node-red-dashboard, or the static content (httpStatic), the
     * following properties can be used.
     * The `pass` field is a bcrypt hash of the password.
     * See http://nodered.org/docs/security.html#generating-the-password-hash
     */
    //httpNodeAuth: {user:"user",pass:"$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN."},
    //httpStaticAuth: {user:"user",pass:"$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN."},

/*******************************************************************************

I'm running NodeRED on a RPi4.
NodeRED version: v3.1.3
Node.JS version: v18.19.0

Thx for your help.

Best regards.

REMOVE YOUR LINK!

The internet will be having fun with your home/devices right now!

REMOVE YOUR LINK!

Do not post your IP address on the forums - with a Node RED instance behind it

1 Like

Thx for your tip.
All functions are actual deactivated until I will have solved the problem.... of course! :wink:

(Link removed)

1 Like

I'm not a pro with how dashboard works - plenty around who are.

Your node-red is open to the internet and is accessible via http.
You really need to secure this page using https and insure you password is very strong. It will not take long to sniff your password if you remain with no TLS encryption. please sort this issue as soon as possible.

I advise that you disconnect your node-red from the internet until you have fully secured with encrypted https the connection Safely accessing Node-RED over the Internet

Thx for your effort.
I'm no expecting a solution within 1 hour :wink:

I already had a long discussion with ChatGPT - after all ideas didn't work he/she/it said: please ask the community. So we see - finally, we need human to fix some problems :wink:

Sei nett zu Dir - und lass' das sein.
Es gibt hier einige Beiträge zum Thema "My Node-RED was hacked!" Lies' sie ganz genau durch & dann ... lass' das sein!
Es gibt auch einige Beiträge zu "How to secure my Node-RED." Ebenfalls durchlesen & umsetzen; ansonsten ... lass' das sein!

@E1cid Also thanks to you.

How I told before - everything is disabled. I am still in the first phase of configuring and learning. Before my system will go online in a final configuration, I will set up a new debian on that device.

So I would like to solve the basic issues first - like this of this topic here.

Oh schön - auf deutsch:

Hallo @ralphwetzel.

Hast Du eine Idee, wo mein Fehler in der settings.js liegt?

VG

@ Ralph.

And big THX for your screenshot in this thread... after I have already removed the link from my post!

Best regards

Denke schon:

Sieht so aus, als ob Du httpNodeAuth definieren solltest.
Und noch einmal:

Ich bin überzeugt, Du bist überzeugt, dass das so ist. :wink:
Jedoch kann jeder node einen Endpoint definieren & über einen solchen Endpoint kann alles mögliche manipuliert werden.
Daher ein weiteres & ein letztes Mal: Lass das sein. You have been warned. :+1:

Beschwer' Dich nicht; der Link ist weiterhin sichtbar.

Ja... mit httpNodeAuth funktioniert das tatsächlich auch - aber dann nur für einen User. Wenn ich mehrere Einträge für httpNodeAuth setze, funktioniert gar kein Login mehr.

Da hieß es dann an anderer Stelle: NodeAuth wieder disablen und stattdessen bei httpNodeMiddleware setzen.

Wenn ich jetzt einen einzigen User zusätzlich bei NodeAuth setze, dann werden alle Einträge unter NodeMiddleware ignoriert und es kann wieder nur der eine User unter NodeAuth rein.

Tu ich doch gar nicht. War nur ein Hinweis.
Aber nochmal: danke für die vielen Tipps.

Wenn ich das richtig interpretiere...

    /** If you installed the optional node-red-dashboard you can set it's path
     * relative to httpNodeRoot
     * Other optional properties include
     *  readOnly:{boolean},
     *  middleware:{function or array}, (req,res,next) - http middleware
     *  ioMiddleware:{function or array}, (socket,next) - socket.io middleware
     */
    //ui: { path: "ui" },

dann läuft das für node-red-dashboard über ui.middleware ... und nicht httpXXMiddleware.
Also:

ui: {
    path: "ui",
    middleware: function(req, res, next) { ... } 
}

Jetzt lädt die Seiute gerade gar nicht mehr.
Ich check jetzt nochmal alle Klammern ab; hab da vielleicht zu hastig gewerkelt.

Also der gesamte Code aus meinem ersten Post dann eingerückt in ui: {}, korrekt?
und das httpNodeMiddleware ersetzen durch middleware, ja?

ui: {
    path: "ui",
    middleware: function(req, res, next) {
        var basicAuth = require('basic-auth');
        var user = basicAuth(req);
        ...
    } 
}

Nebenbei:

    var dashboardMiddleware = function(req, res, next) { next(); }

Dein return next(); sieht für mich daher ... fragwürdig... aus.

Oh moment.

Wo genau bist Du jetzt? Finde den String var dashboardMiddleware gar nicht in meiner settings.js

So sieht der (fehlerhafte) Code aktuell aus:

    ui: {
        path: "ui",
        middleware: function(req,res,next) {

            var basicAuth = require('basic-auth');
            var user = basicAuth(req);

            if (!user || !user.name || !user.pass) {
                res.set('WWW-Authenticate', 'Basic realm=Authorization Required');
                return res.sendStatus(401);
            }

            var users = [
                { username: 'user1', password: 'foo' },
                { username: 'user2', password: 'bar' },
                { username: 'user3', password: 'test' },

            ];

            var isValid = users.some(function(u) {
                return u.username === user.name && u.password === user.pass;
            });

            if (isValid) {
                return next();
            } else {
                res.set('WWW-Authenticate', 'Basic realm=Authorization Required');
                return res.sendStatus(401);
            }
        }
    }

dashboardMiddleware ist im Quellcode von node-red-dashboard definiert.
Ich würde erst einmal prüfen, ob die Funktion aufgerufen wird ... und damit die weitere Fehlersuche starten: