ДОВІДНИК З NODE-RED українською мовою
На головну | Розділ |
---|---|
<- Проекти | Основні вузли -> |
За замовчуванням редактор Node-RED не захищений - кожен, хто може отримати доступ до IP-адреси може отримати доступ до редактора та впроваджувати зміни. Це підходить лише для роботи в надійній мережі.
У цьому розділі описано, як можна захистити Node-RED. Безпека поділена на три частини:
Щоб увімкнути доступ до редактора Node-RED через HTTPS, а не HTTP за замовчуванням, ви можете скористатися параметром конфігурації https
у вашому settings file.
Параметр https
може бути або статичним набором параметрів конфігурації, або, починаючи з Node-RED 1.1.0, функцією, яка повертає параметри.
Повний набір опцій параметрів у цьому документі.
Як мінімум рекомендується включати такі параметри:
key
- первинний ключ в форматі PEM, що забезпечується типом String
або Buffer
cert
- ланцюжок сертифікатів в форматі PEM , що забезпечується типом String
або Buffer
Щоб дізнатися, як генерувати сертифікати, ви можете прочитати цей посібник або його частково перекладену версію.
Файл налаштувань 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
})
});
}
Починаючи з Node-RED 1.1.0
Можна налаштувати Node-RED періодично оновлювати свої HTTPS-сертифікати без необхідності перезапускати Node-RED. Це можна зробити наступним чином:
Ви повинні використовувати Node.js 11 або новішої версії
https
повинен бути функцією, яку можна викликати для отримання оновлених сертифікатівhttpsRefreshInterval
в значення як часто (години) Node-RED повинен викликати функцію ` https`, щоб отримати оновлені деталі.Функція https
повинна означити, чи закінчується термін дії поточних сертифікатів протягом наступного періоду httpsRefreshInterval
, і якщо так, генерувати новий набір сертифікатів. Якщо оновлення не потрібно, функція може повернути undefined
або null
.
Редактор та API адміністратору підтримує два типи автентифікації:
автентифікація на основі введення імені користувача та пароля
автентифікація що спирається на будь-якого постачальника OAuth/OpenID таких наприклад як Twitter чи GitHub
Щоб увімкнути аутентифікацію користувача в 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
Щоб використовувати зовнішнє джерело автентифікації, 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 приймає такі варіанти:
name - назва паспортної стратегії, що використовується
strategy - модуль паспортної стратегії
label/icon - використовується на сторінці входу. icon може бути будь-яким значком FontAwesome.
options - об'єкт опцій, який передається до паспортної стратегії, коли вона створюється. Зверніться до власної документації стратегії, для чого вона потрібна. Нижче дивіться на вузол callbackURL.
verify - функція перевірки, яка використовується стратегією. Потрібно викликати done з використанням профілю користувача як другого аргументу, якщо користувач є дійсним. Очікується, що це буде властивість username яка використовується для перевірки зі списку дійсних користувачів. Паспорт намагається стандартизувати об'єкт профілю користувача, тому більшість стратегій забезпечують цю властивість.
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 користувачі можуть мати один із двох дозволів:
* - повний доступ
read – тільки читання
Починаючи з Node-RED 0.14 дозволи можуть бути набагато більш тонкорівневими і підтримувати їх властивість може як однин рядок, так і масив, що містить кілька дозволів.
Кожен метод Admin API означує, який рівень дозволу потрібен для доступу до нього. Модель дозволу базується на основі ресурсів. Наприклад, щоб отримати поточну конфігурацію, користувачеві буде потрібно дозвіл flows.read. Але для оновлення потоків їм знадобиться дозвіл flows.write.
За замовчуванням маркери доступу закінчуються через 7 днів після їх створення. Наразі Node-RED не підтримує оновлення токену більше ніж цей час.
Час вичерпання може бути налаштований шляхом встановлення властивості sessionExpiryTime
в налаштуваннях adminAuth
. Він вказується наскільки токен дійсний у секундах. Наприклад, щоб встановити термін дії токенів на 1 день:
adminAuth: {
sessionExpiryTime: 86400,
...
}
З набором властивостей adminAuth
Admin API documentation описує як отримати доступ до API.
Замість того, щоб користувачам вводити жорстко код в файл налаштувань, можна також підключити спеціальний код для автентифікації користувачів. Це дає змогу інтегруватися з існуючими схемами автентифікації.
Наступний приклад показує, як зовнішній модуль може використовуватися для надання користувацького коду автентифікації.
<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"});
});
}
}
adminAuth: require("./user-authentication")
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"
}
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 In
можуть бути захищені за допомогою базової автентифікації.
Для визначення єдиного імені користувача та пароля, яким буде дозволено доступ до маршрутів може бути використана властивість httpNodeAuth
в файлі settings.js
.
httpNodeAuth: {user:"user",pass:"$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN."},
Властивість pass
використовує той самий формат, що й adminAuth
. Дивіться створення хеша паролю для додаткової інформації.
Доступ до будь-якого статичного вмісту, означеного властивістю httpStatic
, може бути забезпечена за допомогою властивості httpStaticAuth
, яка використовує той самий формат.
Примітка : у попередніх версіях Node-RED властивість pass
очікувалася як хеш MD5. Це криптографічно небезпечно, тому його замінили bcrypt, що використовується adminAuth
. Для зворотної сумісності хеш MD5 все ще підтримується, але не рекомендуються до застосування.
Можна надати спеціальне проміжне програмне забезпечення 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();
},
Іншими можливими способами використання буде додавання додаткових рівнів безпеки або запит на перевірку маршрутів.