Статьи

Создание вашего стартапа: основы безопасности

Конечный продукт
Что вы будете создавать

Это руководство является частью серии « Создай свой стартап с помощью PHP» на Envato Tuts +. В этой серии я проведу вас через запуск стартапа от концепции до реальности, используя мое приложение Meeting Planner в качестве примера из реальной жизни. На каждом этапе я буду публиковать код Планировщика собраний в качестве примеров с открытым исходным кодом, из которых вы можете извлечь уроки. Я также буду решать вопросы, связанные с бизнесом по мере их возникновения.

Рабочий сервер для Meeting Planner в настоящее время работает в Digital Ocean (см. Другие учебные пособия по ним в Envato Tuts +.) В сегодняшнем выпуске мы углубимся в основы безопасности веб-сервера. Я расскажу об обеспечении Linux VPS, на котором работает Meeting Planner, и о некоторой базовой безопасности Yii. В следующем эпизоде ​​я подробнее расскажу о безопасности программных приложений Yii.

Я принимаю участие в комментариях ниже, поэтому, пожалуйста, поделитесь своими отзывами. Пожалуйста, дайте мне знать, если есть темы безопасности, которые, по вашему мнению, я пропустил Я также открыт для новых идей и тематических предложений для будущих уроков.

Напоминаем, что весь код для Meeting Planner написан на Yii2 Framework для PHP. Если вы хотите узнать больше о Yii2, ознакомьтесь с нашей параллельной серией Программирование с Yii2 .

Если вы еще этого не сделали, попробуйте Планировщик собраний прямо сейчас, запланировав свою первую встречу . Не стесняйтесь оставлять отзывы о вашем опыте в комментариях ниже.

Если вы используете универсальный Linux VPS, вы можете просмотреть мой предыдущий учебник Envato Tuts +, « Безопасность входа на сервер» . Он охватывает ряд шагов, которые мы рассмотрим сегодня, в том числе безопасность SSH и брандмауэры.

Digital Ocean также является отличным ресурсом для практики безопасности. Введение в защиту вашего Linux VPS — один из лучших обзоров, которые они предлагают. Плюс у них классная графика.

Startup Series - 7 мер безопасности через Digital Ocean - изображение гунноподобных захватчиков
через Digital Ocean 7 мер безопасности для защиты ваших серверов

Вот три другие статьи, которые они предлагают, которые я использовал для фона в этом уроке:

Во-первых, очень важно регулярно обновлять и обновлять свой сервер. Это объединяет исправления безопасности от поставщиков программного обеспечения (и с открытым исходным кодом), которые вы используете.

Вот основные шаги — вы, вероятно, будете знакомы с ними:

1
2
3
4
5
6
7
8
$ sudo apt-get update
Get:1 http://security.ubuntu.com trusty-security InRelease [65.9 kB]
Get:2 http://security.ubuntu.com trusty-security/main Sources [118 kB]
Get:3 http://security.ubuntu.com trusty-security/universe Sources [38.0 kB]
Ign http://mirrors.digitalocean.com trusty/universe Translation-en_US
Fetched 5,298 kB in 10s (526 kB/s)
Reading package lists… Done

Dist-upgrade использует некоторый интеллект для управления взаимозависимостями обновленных пакетов:

01
02
03
04
05
06
07
08
09
10
11
12
$ sudo apt-get dist-upgrade
Reading package lists… Done
Building dependency tree
Reading state information… Done
Calculating upgrade… Done
The following packages were automatically installed and are no longer required:
  linux-headers-3.13.0-85 linux-headers-3.13.0-85-generic
  linux-headers-3.13.0-86 linux-headers-3.13.0-86-generic
 …
Setting up cloud-init (0.7.5-0ubuntu1.19) …
Leaving ‘diversion of /etc/init/ureadahead.conf to /etc/init/ureadahead.conf.disabled by cloud-init’
Processing triggers for libc-bin (2.19-0ubuntu6.9) …

Чтобы убедиться, что он вступает в силу в полной мере, вам может потребоваться перезагрузка при необходимости. Я всегда останавливаю свою базу данных, а затем перезапускаю:

1
2
3
4
5
6
7
8
9
$ sudo service mysql stop
mysql stop/waiting
$ sudo reboot
$
Broadcast message from meetingplanner.io
    (/dev/pts/0) at 13:51 …
The system is going down for reboot NOW!
Connection to meetingplanner.io closed by remote host.
Connection to meetingplanner.io closed.

Когда у Meeting Planner больше пользователей, могут потребоваться более сложные механизмы перезапуска.

Серия запуска - Аутентификация по ключу SSH
Изображение с помощью 7 мер безопасности Digital Ocean для защиты ваших серверов

У вас есть возможность использовать свой закрытый ключ при создании капли Digital Ocean. Когда я настраивал Meeting Planner, я повторял шаги, которые я изложил здесь: Защита входа на сервер .

Я также перенес SSH-вход на пользовательский порт, а не на обычно используемый (и атакованный) порт 22.

Серия Startup - фильтрация запросов межсетевого экрана
Изображение с помощью 7 мер безопасности Digital Ocean для защиты ваших серверов

Затем я установил UFW, простой брандмауэр:

1
2
$ sudo ufw enable
Command may disrupt existing ssh connections.

Однако я не сказал «да» этой просьбе. Предупреждение напомнило мне перепроверить все мои требования SSH.

Например, я отключил порт SSH по умолчанию и включил тот, который я использую:

1
2
$sudo ufw allow 31345
$sudo ufw deny 22

Затем я установил запрос sudo на будущее, чтобы отключить UFW в случае, если мои настройки не были правильными:

1
2
3
4
5
$sudo at now +5 minutes
warning: commands will be executed using /bin/sh
at> sudo ufw disable
at> <EOT>
job 9 at Mon Jul 18 16:14:00 2016

Затем я включил UFW и пробежал по оставшимся настройкам:

1
2
3
4
5
6
7
8
$sudo ufw default deny incoming
$sudo ufw default allow outgoing
$sudo ufw allow http
$sudo ufw allow https
$sudo ufw deny mysql
$sudo ufw enable
Command may disrupt existing ssh connections.
Firewall is active and enabled on system startup

Вот результаты:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
$ sudo ufw status
Status: active
 
To Action From
— —— —-
31345 ALLOW Anywhere
80 ALLOW Anywhere
443 ALLOW Anywhere
22 DENY Anywhere
3306 DENY Anywhere
31345 (v6) ALLOW Anywhere (v6)
80 (v6) ALLOW Anywhere (v6)
443 (v6) ALLOW Anywhere (v6)
22 (v6) DENY Anywhere (v6)
3306 (v6) DENY Anywhere (v6)

Примечание. Поскольку моя база данных в настоящее время работает на том же сервере, что и веб-службы Meeting Planner, я могу заблокировать порт 3306. Однако, поскольку использование сайта масштабируется до нескольких серверов, потребуются изменения.

Я также отредактировал конфигурацию UFW, чтобы включить брандмауэр при перезапуске сервера:

1
2
$sudo nano /etc/ufw/ufw.conf
enabled = on

Из-за отложенной команды отключения мне пришлось снова включить UFW через пять минут.

В дополнение к моей защите входа на сервер , Digital Ocean также помогает при настройке UFW UFW Essentials: Общие правила и команды брандмауэра и Как настроить брандмауэр с UFW на Ubuntu и Debian Cloud Server .

Серия Startup - позволяет зашифровать новый центр сертификации бесплатно и автоматически

Для безопасности людей, использующих Meeting Planner, я также настроил SSL, как описано в разделе « Использование шифрования SSL в вашем проекте WordPress» .

И, вы можете заметить, я разрешил доступ https через порт 443 при настройке брандмауэра выше. Запросы на http://meetingplanner.io автоматически перенаправляют на https://meetingplanner.io .

Помимо основы безопасности Linux, мы также должны задуматься о защите Yii Framework поверх PHP. Вы можете прочитать Программирование с Yii2: Безопасность , большинство из которых мы рассмотрим в следующем эпизоде.

Однако сегодня мы реализуем некоторые основные функции управления доступом для Meeting Planner.

Одним из начальных преимуществ использования среды PHP MVC является то, что все запросы на страницы направляются через один файл index.php. Как я описал в Программирование с помощью Yii2: маршрутизация и создание URL , Yii тщательно управляет входящими запросами на страницы и направляет их соответствующим контроллерам и методам действий.

Кроме того, наша задача — защищать запросы контроллеров, когда они поступают в приложение. Прежде всего, кто этот человек и имеют ли они право доступа к этой странице?

Как обсуждалось в руководстве по безопасности Yii2 , в Yii есть множество вариантов управления доступом. Планировщик собраний в основном использует возможности контроля доступа.

Вот пример трафика, поступающего в Meeting Controller, к которому пользователи обычно обращаются:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class MeetingController extends Controller
{
  public function behaviors()
  {
    return [
    …
    ‘access’ => [
        ‘class’ => \common\filters\MeetingControl::className(), // \yii\filters\AccessControl::className(),
        ‘only’ => [‘index’,’view’,’create’,’update’,’delete’, ‘decline’,’cancel’,’command’,’download’,’wizard’,’trash’,’late’],
        ‘rules’ => [
          // allow authenticated users
           [
               ‘allow’ => true,
               ‘actions’=>[‘create’,’index’,’view’,’update’,’delete’, ‘decline’,’cancel’,’command’,’download’,’wizard’,’trash’,’late’],
               ‘roles’ => [‘@’],
           ],
          [
              ‘allow’ => true,
              ‘actions’=>[‘command’],
              ‘roles’ => [‘?’],
          ],
          // everything else is denied
        ],
    ],
  ];
  }

Поведение доступа защищает все методы, упомянутые в 'only' . actions перечисленные с roles '@' требуют аутентифицированных пользователей — другими словами, только пользователи, вошедшие в систему, могут видеть эти страницы. Пользователи, которые не вошли в систему, перенаправляются на домашнюю страницу по умолчанию. Тем не менее, страницы с roles '?' открыты для публики.

Так, например, только авторизованный пользователь может create собрание, но любой может войти в приложение через URL-адрес собрания / команды. Это потому, что мы широко используем URL команды в электронных письмах, и у нее есть еще один уровень аутентификации, описанный в руководстве по доставке приглашений .

URL-адрес команды позволяет пользователям, которые не вошли в систему (и даже участникам собрания, которые никогда ранее не посещали сайт), получить безопасный доступ к определенным страницам.

Для внутренней системы Планировщика собраний только администраторы могут получить доступ к этим страницам. Поскольку администраторы обозначены в нашей таблице «Пользователь» специальным, специфичным для приложения способом, мне пришлось создать собственное правило доступа для их проверки. Основные роли Yii поддерживают только аутентифицированные @ и не аутентифицированные ? ,

Давайте посмотрим на внутренний MessageController для отправки обновлений электронной почты по всему сайту нашим пользователям:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
class MessageController extends Controller
{
    /**
     * @inheritdoc
     */
    public function behaviors()
    {
      return [
        ‘access’ => [
          ‘class’ => AccessControl::className(),
          ‘rules’ => [
            [
              ‘allow’ => true,
              ‘matchCallback’ => function ($rule, $action) {
                  return (!\Yii::$app->user->isGuest
                    && \common\models\User::findOne(Yii::$app->user->getId())->isAdmin());
                }
            ],
          ],
        ],

Настраиваемое правило гарантирует, что пользователь не является гостем, и передает isAdmin() прежде чем перенаправить его на соответствующее действие. Другие пользователи перенаправляются на страницу входа в систему.

Сегодня мы многого достигли, но многое еще предстоит сделать.

Если вы используете сервер, вы, вероятно, оценили сегодняшний обзор базовой Linux и безопасности хостинга. В следующем эпизоде ​​мы рассмотрим шаги безопасности, более тесно связанные с платформой Yii Framework и приложением Meeting Planner.

Следите за будущими уроками в серии « Построение стартапа с помощью PHP» . Есть еще несколько важных функций.