8 января 2014 г.

Безопасный доступ к OpenRemote

Мы создали первое приложение в OpenRemote в локальной сети. Но ясное дело , что управлять то мы хотим не только из локальной сети, а еще и через интернет. Это означает, что нам надо обеспокоиться нашей безопасностью. Ну и самые элементарные вещи это - внедрение парольной защиты и шифрование трафика между клиентом и контроллером.

1. Зашифрованное соединение.

Очевидно, что для шифрования трафика надо использовать https. Подготовим самоподписанные сертификаты в директории /home/openremote/.keystore:

  1. $ keytool -genkey -alias tomcat -keyalg RSA -validity 3600 -keystore ~/.keystore  

Когда спросят про второй пароль его вводить не надо - вы обязаны оставить прежний (по умолчанию). Далее переходим в файл /srv/openremote/conf/server.xml и правим следующий кусок:

  1.       
  2. <connector clientauth="false" keystorepass="changeit"   
  3. maxthreads="150" port="8443" protocol="HTTP/1.1" scheme="https"   
  4. secure="true" sslenabled="true" sslprotocol="TLS">  

Внимание, мы не только его раскомментировали, но и добавили keystorePass="changeit" - пароль, который вводили при генерации сертификатов. Пробуем запускать скрипт с параметром run - так видно логи сервера. Заходим https://192.168.xx.xx:8443/webconsole/ - должно работать. Теперь закомментируем небезопасный порт 8080, чтобы протестировать клиентов.

Пробуем андроид клиент - в нем адрес контроллера оставляем, только нажимаем на кнопочку SSL в самом низу настроек. Порт указан там же. Теперь пробуем онлайн webconsole, тут по-другому. Удаляем старый адрес контроллера, вводим новый https://192.168.xx.xx:8443/controller/

2. Авторизация.

Хорошо, с шифрованным соединением решили. Авторизация тоже заложена в системе, но немного не явным образом. Для начала правим файл: /security/users.xml:

  1. <?xml version='1.0' encoding='utf-8'?>  
  2. <tomcat-users>  
  3.   <role rolename="openremote"/>  
  4.   <user username="vermus" password="test" roles="openremote"/>  
  5. </tomcat-users>  


Потом открываем файл webapp/controller/WEB-INF и расскоментируем следующие строки:
  1. <!-- Constraint resource: /rest/control/* -->  
  2.     
  3.     <security-constraint>  
  4.       <web-resource-collection>  
  5.         <web-resource-name>Control command RESTful service of Openremote Controller</web-resource-name>  
  6.         <description>Control command RESTful service of Openremote Controller</description>  
  7.         <url-pattern>/rest/control/*</url-pattern>  
  8.         <http-method>GET</http-method>  
  9.         <http-method>POST</http-method>  
  10.       </web-resource-collection>  
  11.       <auth-constraint>  
  12.         <role-name>openremote</role-name>  
  13.       </auth-constraint>  
  14.     </security-constraint>  
  15.     
  16.   
  17.   <!-- Constraint resource: /rest/panel/* -->  
  18.     
  19.     <security-constraint>  
  20.       <web-resource-collection>  
  21.         <web-resource-name>Panel identity RESTful service of Openremote Controller</web-resource-name>  
  22.         <description>Panel identity RESTful service of Openremote Controller</description>  
  23.         <url-pattern>/rest/panel/*</url-pattern>  
  24.         <http-method>GET</http-method>  
  25.         <http-method>POST</http-method>  
  26.       </web-resource-collection>  
  27.       <auth-constraint>  
  28.         <role-name>openremote</role-name>  
  29.       </auth-constraint>  
  30.     </security-constraint>  
  31.     
  32.   
  33.     
  34.    <security-constraint>  
  35.      <web-resource-collection>  
  36.        <web-resource-name>Status command RESTful service of Openremote Controller</web-resource-name>  
  37.        <description>Status command RESTful service of Openremote Controller</description>  
  38.        <url-pattern>/rest/status/*</url-pattern>  
  39.        <http-method>GET</http-method>  
  40.        <http-method>POST</http-method>  
  41.      </web-resource-collection>  
  42.      <auth-constraint>  
  43.        <role-name>openremote</role-name>  
  44.      </auth-constraint>  
  45.    </security-constraint>  
  46.    <security-constraint>  
  47.      <web-resource-collection>  
  48.        <web-resource-name>Polling command RESTful service of Openremote Controller</web-resource-name>  
  49.        <description>Polling command RESTful service of Openremote Controller</description>  
  50.        <url-pattern>/rest/polling/*</url-pattern>  
  51.        <http-method>GET</http-method>  
  52.        <http-method>POST</http-method>  
  53.      </web-resource-collection>  
  54.      <auth-constraint>  
  55.        <role-name>openremote</role-name>  
  56.      </auth-constraint>  
  57.    </security-constraint>  
  58.     
  59.    
  60.     <login-config>  
  61.       <auth-method>BASIC</auth-method>  
  62.       <realm-name>OPENREMOTE_Controller</realm-name>  
  63.     </login-config>  
  64.     <security-role>  
  65.       <role-name>openremote</role-name>  
  66.     </security-role>  
  67. </pre>  


Заходим в webconsole и при клике на выбранной панели система спросит нас логин с паролем. Приложение для андроид (кстати, качайте последнее с сайта, в google play на данный момент 2.0.0 , который даже не поддерживает https).

Итак, мы неплохо обезопасили нашу систему, жаль что для новичков эти шаги были бы не очевидными. Плюс меня еще смущает: древняя версия openremote под андроид в гугл плей, отсутствие внятной документации, онлайновый дизайнер, отсутствие сбора данных, ориентированность на платный продукт и т.п....
В общем, я решил испробовать другую систему openhab, которая лишена всех этих недостатков, хоть в ней вроде бы и есть проблема с 1-wire. Я думаю ее можно как-то решить, кроме owserver же есть еще и owhttpd (может http binding сработает) и owfs (может можно писать в файлы локально). Хоть ее и начали писать позже openremote кстати! Но по моим наблюдениям она гораздо динамичнее развивается. В общем, будем смотреть!

Комментариев нет:

Отправить комментарий