• Минимальные настройки безопасности Linux на VPS?

    Tyranron
    @Tyranron
    Ряд моментов Вы уже сделали, но я все равно их опишу для полноты списка.

    1. Создать отдельного пользователя и хороший пароль на sudo. Не использовать больше root напрямую. Совсем.

    2. SSH. Отключаем метод аутентификации по паролю. Если Вам не нужны другие методы, то их тоже можно отключить, оставив только publickey. Отключаем возможность аутентификации root'ом. Включаем использование только 2й версии SSH протокола.

    3. Устанавливаем Fail2Ban и настраиваем чтобы после нескольких неуспешных попыток подключения по SSH банило по IP на длительное время. Кол-во попыток и время бана можно тюнить в меру своей паранойи. У меня, например, банит на час после 2х неуспешных попыток.

    4. Iptables. Действуем по принципу "запрещено все, что не разрешено". Запрещаем по умолчанию весь INPUT и FORWARD трафик снаружи. Открываем на INPUT'е 22 порт. В дальнейшем открываем порты/forwarding по мере необходимости. Если у нас предполагаются сервисы на соседних серверах нужные только для внутренней коммуникации (Memcached, Redis, и т.д.), то открываем для них порты только для определенных IP. Просто так торчать наружу для всех они не должны.

    5. Настраиваем автоматические обновления apt-пакетов. Уровень security. То есть так, чтобы обновления безопасности накатывались автоматически, но при этом не выполнялись обновления со сменой мажорной версии (дабы обезопасить себя от "само сломалось").

    6. Устанавливаем ntpd. Серверное время должно быть точным. Также временную зону сервера лучше всего установить в UTC.

    7. TLS (не SSL) используем везде где можем. Через Let's Encrypt получаем бесплатные валидные сертификаты. В конфигах веб-серверов, mail-серверов, и других приложений торчащих наружу (в том числе и OpenVPN), запрещаем/убираем использование слабых шифров. Все ключи/параметры генерируем не менее 2048 бит. Самоподписные сертификаты подписываем с помощью SHA-256 (не SHA-1). Diffie-Hellman параметры (dh.pem) под каждый сервис лучше сгенерить отдельно. Проверяем TLS сервисов через Nmap. Минимальный grade должен быть A, не должно быть warning'ов.

    8. Правильный менеджмент пользователей/групп. Приложения/сервисы не должны запускаться под root'ом (разве что они действительно этого требуют и иначе никак). Для каждого сервиса создается свой пользователь.

    9. Если предполагается upload файлов через PHP (либо другие скриптовые языки), в директории, куда эти файлы загружаются (и которая доступна снаружи), должно быть жестко отключено любое выполнение скриптов/бинарников, что на уровне ОС (x права), что на уровне веб-сервера.

    Это была база.
    Дальше, в меру своей паранойи можно за'harden'ить сервер ещё следующими моментами:
    - SELinux, chroot
    - доступ к SSH только с определенных IP (нужно иметь 3-4 VPN-сервера под рукой)

    UPD И да, все это помнить/настраивать руками каждый раз может быть запарно. Используйте Ansible и автоматизируйте процесс (там родные и YAML, Jinja2 и Python).
    Ответ написан
    10 комментариев
  • Рекомендации по книге node.js в действии?

    abyrkov
    @abyrkov
    JavaScripter
    Да, это самая большая проблема - устаревший материал. Но, получить свежий можно только читая документацию.
    Вывод прост: читайте что есть, а потом читайте документацию
    Ответ написан
    Комментировать
  • Какие макеты сейчас нужны верстальщику для адаптива?

    Ankhena
    @Ankhena Куратор тега CSS
    Нежно люблю верстку
    Было бы хорошо, чтобы дизайнер был в курсе диапазона размеров экранов.
    И рисовал или писал сопроводительные бумажки так, чтобы было понятно как макет будет выглядеть на любой ширине экрана. Например, 642 точки.
    Чем мне понятнее будет его задумка, тем быстрее верстка будет ей соответствовать.

    Если дизайнер просто нарисовал что-то (или нечто) для каких-то размеров, а на серединки не хватило оплаты/времени/таланта или просто наплевать, то промежуточные варианты я будут верстать так, как посчитаю нужным.
    Ответ написан
    2 комментария
  • Как сделать faq на сайт?

    @Wexter
    Могу посоветовать не страдать хернёй и заняться реализацией задачи.
    Ответ написан
    Комментировать
  • Можно ли использовать Webpack для верстки?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Нет необходимости. Gulp справляется с вашими задачами не хуже (а может и лучше).
    Ответ написан
    2 комментария
  • Как обновить Node.js до версии 7 если уже стоит 4-ая на Убунту?

    Pinsky
    @Pinsky
    Кофеиноникотиновая смесь в backend-код
    используйте nvm.
    При необходимости - можно хоть переключать на лету версии.
    Ответ написан
    5 комментариев
  • Как заполнить один объект свойствами другого?

    AppFA
    @AppFA
    Frontend developer at Yandex
    Как-то так:
    https://jsfiddle.net/qjszwq0h/
    Ответ написан
    Комментировать
  • Какие проекты может потянуть один человек?

    Neznayka1979
    @Neznayka1979
    Интересы - IT, психология...
    6c7e635425e24eda90fd4ac9d80c9adb.gif

    Маргарет Гамильтон стоит рядом с написанным ей исходным кодом бортового компьютера «Аполлона»
    Ответ написан
    11 комментариев
  • Какая разница между ES5 и ES6?

    sfi0zy
    @sfi0zy Куратор тега JavaScript
    Creative frontend developer
    Текущий стандарт начинается со слов:
    ECMA-262
    7ᵗʰ Edition / June 2016
    ECMAScript® 2016 Language Specification

    Прошлый:
    Standart ECMA-262
    6th Edition / June 2015
    ECMAScript® 2015 Language Specification

    Еще раньше начинался так:
    Standard ECMA-262
    5.1 Edition / June 2011
    ECMAScript® Language Specification


    Ходят слухи, что в те далекие времена говорили просто - Javascript, и никто особо не заморачивался. В особо запущенных случаях разделяли пятую версию и самую древнюю - третью (ее использовали особые гуру для поддержки каких-то динозавров и осликов). Но с некоторых пор стандарт стал обновляться каждый год, и к названию ECMAScript добавили год издания стандарта, но старая нумерация (3,5,6,7) осталась в сердцах людей, вот и получается, что "ES2015" - это "ES6 по старому стилю", "ES2016" - "ES7 по старому стилю".
    Ответ написан
    2 комментария
  • Какая разница между ES5 и ES6?

    @frozen_coder
    Java-developer
    Всё правильно Вам человек сказал. ES6 - 6 версия стандарта, официальное название её же - ES2015. Это одно и тоже.
    www.ecma-international.org/ecma-262/6.0
    ES5 - это вообще другой, старый стандарт.
    www.ecma-international.org/ecma-262/5.1
    Готовится к выходу 7версия ecma-262 под оф. названием ES2016
    www.ecma-international.org/ecma-262/7.0
    P.S. Извините, но для таких вопросв есть гугл
    Ответ написан
    1 комментарий
  • Как происходит процесс разработки в команде между фронтенд и бэкэнд, если есть jade и php?

    sabramovskikh
    @sabramovskikh
    jade компилится в хтмл и отдается.
    Тот кто натягивает движок, ему не нужно знать о ваших jade,saas,gulp. Он получает файл html+css+images и работает с этим.
    Есть правки по верске, делаете правки, отправляете, он правит у себя.
    Конечно все через общий гит делается
    Ответ написан
    Комментировать
  • Несколько вопросов о mongodb?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Я работаю с MongoDB уже более 3 лет, поэтому буду рассказывать и давать советы опираясь на личный опыт эксплуатации.

    Получается, что нас всю жизнь учили данные нормализовывать и объясняли, почему это хорошо, а теперь все с точностью наоборот?

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

    Объясните, пожалуйста, на пальцах, правильно ли я все понимаю?

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

    Как в монго при этом обновлять данные, которые хранятся в каждом документе?


    Это реализуется с помощью банальных обновлений.
    Например, если у меня есть коллекция с книгами, в которой мне нужно обновить авторов.

    Типичная запись в ней выглядит так
    {
        "_id" : ObjectId("5801aa17964c6b2a050041a7"),
        "title" : "New Book",
        "authors" : [ 
            {
                "_id" : ObjectId("5801aa0f964c6b26030041a9"),
                "firstName" : "Phil",
                "lastName" : "Tkachev"
            }
        ]
    }


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

    db.getCollection('book').update(
     {'authors._id':ObjectId("5801aa0f964c6b26030041a9")}, 
     {$set: {'authors.$.firstName': 'Philipp'}  }, 
     {multi: true } 
    )


    Здесь есть ряд разных сценариев, просто почитайте документацию. В ней все неплохо расписано.

    Приемлемо ли в монго денормализовывать данные, чтобы хранить данные в отдельной коллекции, и обращаться к ним отдельным запросом (ведь джоинов там нет)?


    Есть ряд случаев, когда так и делают. Например есть разного рода ORM, тот же Mongoose, который так и делает.

    И принято ли так работать?


    И да, и нет. Когда вы работаете с такого рода базой данных, вам нужно подходить к организации данных исходя из решаемой проблемы, отталкиваться от проекта будущего приложения или решения задачи.
    Вам просто нужно ответить на вопрос, что дешевле, запросить документ по ключу или обновить запись внутри документов.
    Взять к примеру, ваш сайт, в котором есть новости и их авторы. Новости могут читать миллионы, а значит при обращении к каждой новости нужно будет делать подзапрос на информацию о каждом авторе. Т.е. вместо одного запроса, при просмотре новости, нужно будет делать 2. А если показывать список из 100 новостей? Будете делать 100 вторичных запросов? Нет, это тоже неправильно. Нужно будет получить список новостей, в коде приложения собрать идентификаторы авторов, сделать второй подзапрос, получить информацию об авторах, затем объединить ее с уже полученным списком статей. Это немного усложнит ваше приложение, но тоже позволит сэкономить ресурсы. Если вы встроите авторов внутрь статьи, это позволит вам обойтись одним запросом к базе, хоть на просмотр, хоть на список новостей. С другой стороны вам прийдется подумать об обновлении информации об авторе. Но, т.к. такая информация меняется сравнительно редко, то есть смысл встраивания.

    Что делать, если изменилась структура данных, если структуры то и нет?


    Здесь все просто. Когда вы разрабатываете свое приложение, вы изначально закладываете в него обработку изменений. Например, вы можете добавить поле версии документа, в котором храните номер версии структуры и реагировать на ее изменение в коде. Либо вы можете просто писать приложение таким образом, что оно автоматически будет конвертировать структуру из старой в новую при первом обращении.

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

    Коллекция новостей:

    {
    	_id: 'MongoId',
    	title: '',
    	body: '',
    	author: {
    		_id: 'идентификатор пользователя',
    		name: 'Имя пользователя',
    		subscribers: 'Количество подписчиков'
    	}
    }


    Автор является неполной копией данных о пользователе. Это поможет сэкономить место и позволит избежать ненужных запросов.

    Коллекция пользователей:

    {
    	_id: 'MongoId',
    	name: 'Имя пользователя',
    	email: '',
    	roles: ['user', 'author', 'admin'],
    	subscribers: 'Number'
    }


    Список ролей может опеределять уровень доступных возможностей. Его легко изменить, можно легко найти авторов или админов.

    Коллекция подписок:

    {
    	initiator: {
    		_id: 'идентификатор пользователя, который инициировал подписку',
    		name: 'Имя пользователя'
    	},
    	target: {
    		_id: 'идентификатор автора',
    		name: 'Имя пользователя'
    	},
    	date: 'ISODate',
    	confirmed: 'bool'
    }


    Здесь вы можете подстроить, как список подписок, так и список подписчиков одним запросом.
    Ответ написан
    1 комментарий
  • Как правильно реализовывать адаптивную сетку по БЭМ?

    bootd
    @bootd Куратор тега CSS
    Гугли и ты откроешь врата знаний!
    1 вариант и нужен. То, что много классов, не играет никакой проблемы. Главное именовать их правильно, со смыслом.

    <div class="row">
    <div class="col col12 collg6 colmd7 colsm8 colxsm12">
    
    <div class="blockText"></div>
    
    </div>
    </div>


    .row - это блок с сеткой, т.к. я юзаю флексбок, это главный элемент
    .col - колонка
    .col12 - Сделай ширину колонки по умолчанию 12 из 12
    .collg6 - Сделай ширину колонки на разрешении 1069 размером 6 из 12 (lg - large)
    .colmd7 - Сделай ширину колонки на разрешении 819 размером 7 из 12 (md - middle)
    .colsm8 - Сделай ширину колонки на разрешении 569 размером 8 из 12 (sm - small)
    .colxsm12 - Сделай ширину колонки на разрешении 420 размером 12 из 12 (xsm - extra small)

    Всё очень просто! А главное, удобно!
    Ответ написан
    2 комментария
  • Какой фотошоп необходим верстальщику?

    Верстальщику нужна вот эта штука
    www.adobe.com/ua/creativecloud/extract.html
    Она работает тут и вполне бесплатна https://assets.adobe.com/
    Или вот это https://avocode.com/
    Можно еще это но я не пробовал https://zeplin.io/
    Ответ написан
    1 комментарий
  • Можно ли начать изучения сразу с angular/react, а не чистого js?

    @klinnov
    Нет
    Ответ написан
    Комментировать
  • Как создать такой индикатор скролла страницы?

    Taraflex
    @Taraflex
    Ищу работу. Контакты в профиле.
    Комментировать
  • Как разбить строку в масив?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    /(?!\([^)]*),(?![^(]*\))/
    Ответ написан
    1 комментарий
  • Стоит ли использовать вендорные префиксы CSS в 2017 году?

    MedVedar
    @MedVedar
    e-commerce developer
    В 2017 стоит использовать автопрефиксер и не забивать себе голову такими вещами, которые можно автоматизировать.
    Ответ написан
    Комментировать