NodeREDGuidUKR

ДОВІДНИК З NODE-RED українською мовою

На головну Розділ
<- Проекти Основні вузли ->

Конфігурування безпеки

Security

За замовчуванням редактор Node-RED не захищений - кожен, хто може отримати доступ до IP-адреси може отримати доступ до редактора та впроваджувати зміни. Це підходить лише для роботи в надійній мережі.

У цьому розділі описано, як можна захистити Node-RED. Безпека поділена на три частини:

Активація доступу HTTPS

Щоб увімкнути доступ до редактора Node-RED через HTTPS, а не HTTP за замовчуванням, ви можете скористатися параметром конфігурації https у вашому settings file.

Параметр https може бути або статичним набором параметрів конфігурації, або, починаючи з Node-RED 1.1.0, функцією, яка повертає параметри.

Повний набір опцій параметрів у цьому документі.

Як мінімум рекомендується включати такі параметри:

Щоб дізнатися, як генерувати сертифікати, ви можете прочитати цей посібник або його частково перекладену версію.

Файл налаштувань Node-RED за замовчуванням включає коментований розділ https, який можна використовувати для завантаження сертифікатів з локальних файлів.

https: {
    key: require("fs").readFileSync('privkey.pem'),
    cert: require("fs").readFileSync('cert.pem')
},

Починаючи з Node-RED 1.1.0

Якщо властивість https є функцією, її можна використовувати для повернення об’єкта параметрів. Функція може за бажанням повернути Promise, яка буде вирішуватись для об’єкта параметрів, дозволяючи їй виконатися асинхронно.

https: function() {
    return new Promise((resolve, reject) => {
        var key, cert;
        // Do some work to obtain valid certificates
        // ...
        resolve({
            key: key
            cert: ccert
        })
    });
}

Оновлення сертифікатів HTTPS

Починаючи з Node-RED 1.1.0

Можна налаштувати Node-RED періодично оновлювати свої HTTPS-сертифікати без необхідності перезапускати Node-RED. Це можна зробити наступним чином:

  1. Ви повинні використовувати Node.js 11 або новішої версії

  2. Параметр https повинен бути функцією, яку можна викликати для отримання оновлених сертифікатів
  3. Встановіть httpsRefreshInterval в значення як часто (години) Node-RED повинен викликати функцію ` https`, щоб отримати оновлені деталі.

Функція https повинна означити, чи закінчується термін дії поточних сертифікатів протягом наступного періоду httpsRefreshInterval, і якщо так, генерувати новий набір сертифікатів. Якщо оновлення не потрібно, функція може повернути undefined або null.

API редактору та адміністратору

Редактор та API адміністратору підтримує два типи автентифікації:

Автентифікація на основі логіну і паролю

Щоб увімкнути аутентифікацію користувача в API редактору та адміністратору, необхідно додати (розкоментувати) в файлі settings.js наступне:

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

Властивість users – це масив об'єктів користувача. Це дозволяє визначити декілька користувачів, кожен з яких може мати різні дозволи. Одного звати  admin який має дозвіл робити все в редакторі (permission) та має пароль password який зашифрований алгоритмом bcrypt (показаний хеш паролю). Інший має назву george, який має доступ тільки для читання.

Примітка : у попередніх версіях Node-RED, для активації редакторі HTTP Basic Authentication може використовуватися налаштування  httpAdminAuth   . Цей параметр застарілий і не повинен використовуватися

Створення хеш паролю

Якщо Ви використовуєте Node-RED 1.1.0 або пізнішу версію, можете використовувати команду:

node-red admin hash-pw

Щоб створити відповідний хеш для паролю в старіших версіях, ви можете скористатись  інструментом командного рядка node-red-admin. Необхідно попередньо інсталювати пакет адміністрування (опис тут).

node-red-admin hash-pw

Утиліта запропонує вам пароль, який ви хочете використовувати, а потім видасть хеш, який можна скопіювати у файл налаштувань.

Альтернативний шлях - запустити таку команду з каталогу встановлення Node-RED:

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

Автентифікація на базі OAuth/OpenID

Щоб використовувати зовнішнє джерело автентифікації, Node-RED може використовувати широкий спектр стратегій, що надаються в Passport.

Модулі аутентифікації Node-RED доступні як для Twitter так і для GitHub. Вони складають окремі деталі стратегії, щоб полегшити їх використання. Але вони також можуть бути використані як шаблон для аутентифікації з іншими подібними стратегіями.

Наступний приклад показує, як налаштувати аутентифікацію на Twitter без використання авторизаційного модуля, який ми надаємо.

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: ["*"]}
    ]
};

Властивість strategy  приймає такі варіанти:

 callbackURL використовується як стратегія, коли постачальник автентифікації переспрямовує на наступну спробу авторизації. Це має бути URL-адреса редактора Node-RED з /auth/strategy/callback доданим шляхом. Наприклад, якщо ви маєте доступ до редактора на http://localhost:1880, ви б могли використовувати http://localhost:1880/auth/strategy/callback.

Користувач за замовчуванням

Наведений вище приклад не дозволить будь-кому отримати доступ до редактора, якщо він не ввійшов у систему.

У деяких випадках бажано дозволити кожному певний рівень доступу. Як правило, це дасть доступ лише для читання в редакторі. Щоб це зробити до налаштувань adminAuth  може бути додана властивість default  для визначення користувача за умовчанням:

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

Права користувачів

Перед Node-RED 0.14 користувачі можуть мати один із двох дозволів:

Починаючи з Node-RED 0.14 дозволи можуть бути набагато більш тонкорівневими і підтримувати їх властивість може як однин рядок, так і масив, що містить кілька дозволів.

Кожен метод Admin API означує, який рівень дозволу потрібен для доступу до нього. Модель дозволу базується на основі ресурсів. Наприклад, щоб отримати поточну конфігурацію, користувачеві буде потрібно дозвіл flows.read. Але для оновлення потоків їм знадобиться дозвіл flows.write.

Термін дії Token

За замовчуванням маркери доступу закінчуються через 7 днів після їх створення. Наразі Node-RED не підтримує оновлення токену більше ніж цей час.

Час вичерпання може бути налаштований шляхом встановлення  властивості  sessionExpiryTime в налаштуваннях adminAuth. Він вказується наскільки токен дійсний у секундах. Наприклад, щоб встановити термін дії токенів на 1 день:

adminAuth: {
    sessionExpiryTime: 86400,
    ...
}

Доступ до адміністування АРІ

З набором властивостей  adminAuth Admin API documentation описує як отримати доступ до API.

Користувальницька автентифікація

Замість того, щоб користувачам вводити жорстко код в файл налаштувань, можна також підключити спеціальний код для автентифікації користувачів. Це дає змогу інтегруватися з існуючими схемами автентифікації.

Наступний приклад показує, як зовнішній модуль може використовуватися для надання користувацького коду автентифікації.

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"});
       });
   }
}
adminAuth: require("./user-authentication")

Custom authentication tokens

Since Node-RED 1.1.0

In some circumstances you may need to use your own authentication tokens and not use those generated by Node-RED. For example:

The adminAuth setting can include a tokens function. This function will be called if a request to the admin api does not contain an authentication token that Node-RED recognises as one of its own. It is passed the token provided in the request and should return a Promise that resolves with either the authenticated user, or null if the token is not valid.

adminAuth: {
    ...
    tokens: function(token) {
        return new Promise(function(resolve, reject) {
            // Do whatever work is needed to check token is valid
            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 as this user does not exist
                resolve(null);
            }
        });
    },
    ...
}

By default, it will use the Authorization http header and expect a Bearer type token - passing in just the value of the token to the function. If it is not a Bearer type token, then the full value of the Authorization header will be passed to the function, containing both type and value.

To use a different HTTP header, the tokenHeader setting can be used to identify which header to use:

adminAuth: {
    ...
    tokens: function(token) {
        ...
    },
    tokenHeader: "x-my-custom-token"
}
Accessing the editor with a custom token

To access the editor using a custom token without the login prompt, add ?access_token=<ACCESS_TOKEN> to the URL. The editor will store that token locally and use it for all future requests.

Безпека вузлів HTTP

Маршрути, що виявляються як у вузлах HTTP In можуть бути захищені за допомогою базової автентифікації.

Для визначення єдиного імені користувача та пароля, яким буде дозволено доступ до маршрутів може бути використана властивість  httpNodeAuth в файлі settings.js .

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

Властивість pass використовує той самий формат, що й adminAuth. Дивіться створення хеша паролю для додаткової інформації.

Доступ до будь-якого статичного вмісту, означеного властивістю httpStatic , може бути забезпечена за допомогою властивості  httpStaticAuth, яка використовує той самий формат.

Примітка   : у попередніх версіях Node-RED властивість pass очікувалася як хеш MD5. Це криптографічно небезпечно, тому його замінили bcrypt, що використовується adminAuth. Для зворотної сумісності хеш MD5 все ще підтримується, але не рекомендуються до застосування.

Custom Middleware

Можна надати спеціальне проміжне програмне забезпечення HTTP, яке буде додано перед усіма HTTP In-вузлами та, починаючи з Node-RED 1.1.0, перед усіма маршрутами адміністратора/редактора.

Для вузлів HTTP In, проміжне програмне забезпечення надається як налаштування httpNodeMiddleware.

Наприклад, наступне проміжне програмне забезпечення може бути використане для встановлення http-заголовка X-Frame-Options на всі запити адміністратора/редактора. Це можна використовувати для управління тим, як редактор вставляється на інші сторінки.

httpAdminMiddleware: function(req, res, next) {
    // Set the X-Frame-Options header to limit where the editor
    // can be embedded
    res.set('X-Frame-Options', 'sameorigin');
    next();
},

Іншими можливими способами використання буде додавання додаткових рівнів безпеки або запит на перевірку маршрутів.

Основні вузли ->