Передовые виртуальные и выделенные серверы для проектов любой сложности и структуры.
 Подписывайтесь на Telegram канал!

FreeIPA это сборка программ предназначенных для управление учетными записями и проверки подлинности. Разрабатывается компанией RedHAT. Удобная работа с DNS сервером. Продуманная и удобная работа в панели управления. Англоязычная подробная документация от разработчика.

Введение

Всегда удобно вести базу пользователей в одном месте и использовать данные для работы с различными программами в которых необходима авторизация пользователей. FreeIPA позволяет очень быстро развернуть базу данных пользователей и имеет очень обширный функционал и подробную документацию на английском языке. Очень удобно использовать DNS сервер у которого хорошо продумано управление с панели управления.

Англоязычная документация от разработчика в которой можно найти ответы на все вопросы касающиеся использования FreeIPA.

Предварительная подготовка для установки FreeIPA

Установим операционную систему CentOS 7 c минимального образа и подготовим для установки.

Параметры для установки:

  • Имя узла сети : ipa.sevo44.loc
  • IP: 192.168.0.102
  • Шлюз: 192.168.0.106
  • DNS: 8.8.4.4

DNS указываем только для того чтобы машина могла скачать в интернете нужные пакеты. В последствии мы будем использовать DNS сервер на самом сервере IPA и эти параметры можно будет удалить из настроек.

Необходимо обязательно внести изменения в файл /etc/hosts

vi /etc/hosts
= необходимые изменения =
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
 192.168.0.102 ipa.sevo44.loc ipa

Примечание: Должно быть указано полное доменное имя (FQDN). В противном случае, Kerberos не будет работать! В файле/etc/hostname название машины должно быть ipa.sevo44.loc!

Сетевые настройки CentOS 7

После установки CentOS и не будем подключать и устанавливать ничего лишнего чтобы в дальнейшем не возникло проблем с обновлением системы.

Используя замечательную утилиту настроим сетевые параметры:

nmtui

С помощью её можно указать сетевые настройки и имя машины, если мы не сделали это при установке системы.

После внесения сетевых изменений  перезагрузим сетевые параметры:

service network restart
= вывод команды =
Restarting network (via systemctl): [ OK ]

Проверим есть ли доступ в интернет отправив 4 пакета на ya.ru:

ping -c 4 ya.ru
= вывод команды =
PING ya.ru (87.250.250.242) 56(84) bytes of data.
64 bytes from ya.ru (87.250.250.242): icmp_seq=1 ttl=51 time=13.9 ms
64 bytes from ya.ru (87.250.250.242): icmp_seq=2 ttl=51 time=94.4 ms
64 bytes from ya.ru (87.250.250.242): icmp_seq=3 ttl=51 time=19.8 ms
64 bytes from ya.ru (87.250.250.242): icmp_seq=4 ttl=51 time=17.5 ms

--- ya.ru ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 13.993/36.447/94.483/33.571 ms

Не отключаем SELINUX для FreeIPA

Так как при установке FreeIPA настройки для SELINUX устанавливаются автоматически то отключать нет смысла.

Обновляем без вопросов и перезагружаем сисетему:

yum -y update && reboot

Установка FreeIPA

Устанавливаем необходимые для FreeIPA пакеты без вопросов:

yum -y install ipa-server ipa-server-dns bind bind-dyndb-ldap

Непосредственная установка

Существует два способа установки:

  • с установкой DNS сервера,
  • без установки DNS сервера.

Red Hat рекомендует произвести установку и настойку DNS сервера.
Мы будем устанавливать с DNS сервером и это уверяю вас действительно удобно.

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

ipa-server-install
= вывод команды с необходимыми изменениями =
Файл журнала для этой установки можно найти в файле /var/log/ipaserver-install.log
===================================
Данная программа позволит настроить IPA Server.

Это включает в себя:
* Настроить изолированный CA (dogtag) для управления сертификатами
* Настройка сетевого времени Демон (ntpd)
* Создать и настроить Directory Server
* Создание и настройка центра распространения ключей kerberos (KDC)
* Настроить Apache (httpd)

Чтобы принять значения по умолчанию указаны в скобках, нажмите клавишу Enter.

Вы хотите настроить DNS, интегрированной (BIND)? [no]: !!! yes

Введите полное доменное имя компьютера
на что вы настраиваете программное обеспечение сервера. 
Используя форму
<hostname>.<domainname>
Пример: master.example.com.

Имя хоста сервера [ipa.sevo44.loc]: !!! enter

Предупреждение: пропуск разрешение DNS-узла ipa.sevo44.loc
Имя домена определяется на основе имени узла.

Пожалуйста, подтвердите имя домена [sevo44.loc]: !!! enter

Протокол kerberos требует имя области должны быть определены.
Обычно это доменное имя преобразуется в верхний регистр.

Пожалуйста, укажите имя области [SEVO44.LOC]: !!! enter
 
Определенных операций сервера каталогов требуют права администратора.
Этот пользователь называется менеджер каталога и имеет полный доступ
каталог для задачи управления системой и будет добавлено
экземпляр сервера каталога созданы для ipa.
Пароль должен быть минимум 8 символов.

Directory Manager пароль: ******** 
Пароль (подтверждение): ********

IPA сервер требует права администратора, по имени 'admin'.
Этот пользователь является регулярным системе учетная запись, используемая для управления IPA сервера.

Пароль администратора IPA: ********
Пароль (подтверждение): ********

Checking DNS domain sevo44.loc., please wait ...
Do you want to configure DNS forwarders? [yes]: !!! enter

Following DNS servers are configured in /etc/resolv.conf: 8.8.4.4
Do you want to configure these servers as DNS forwarders? [yes]: !!! enter 
All DNS servers from /etc/resolv.conf were added. You can enter additional addresses now:
Enter an IP address for a DNS forwarder, or press Enter to skip: 8.8.8.8

DNS forwarder 8.8.8.8 added. You may add another.
Enter an IP address for a DNS forwarder, or press Enter to skip: 
Checking DNS forwarders, please wait ...
Do you want to search for missing reverse zones? [yes]: !!! enter
Do you want to create reverse zone for IP 192.168.0.102 [yes]: !!! enter

Please specify the reverse zone name [0.168.192.in-addr.arpa.]: 
Using reverse zone(s) 0.168.192.in-addr.arpa.

The IPA Master Server will be configured with:
Hostname: ipa.sevo44.loc
IP address(es): 192.168.0.102
Domain name: sevo44.loc
Realm name: SEVO44.LOC

BIND DNS server will be configured to serve IPA domain with:
Forwarders: 8.8.4.4, 8.8.8.8
Forward policy: only
Reverse zone(s): 0.168.192.in-addr.arpa.

Продолжить настройку системы с этими значениями? [no]: !!! yes

Следующие операции могут занимать несколько минут.
Пожалуйста, подождите, пока не вернетесь в приглашение.

Откинемся на спинку кресла и ждем...

Выдаст по окончанию результат.
------
Configuring NTP daemon (ntpd)
 [1/4]: stopping ntpd
 [2/4]: writing configuration
 [3/4]: configuring ntpd to start on boot
 [4/4]: starting ntpd
Done configuring NTP daemon (ntpd).
Configuring directory server (dirsrv). Estimated time: 1 minute
 [1/42]: creating directory server user
 = часть вывода скрыта =
 [42/42]: configuring directory to start on boot
Done configuring directory server (dirsrv).
Configuring certificate server (pki-tomcatd). Estimated time: 3 minutes 30 seconds
 [1/28]: creating certificate server user
 = часть вывода скрыта =
 [28/28]: updating IPA configuration
Done configuring certificate server (pki-tomcatd).
Configuring directory server (dirsrv). Estimated time: 10 seconds
 [1/3]: configuring ssl for ds instance
 [2/3]: restarting directory server
 [3/3]: adding CA certificate entry
Done configuring directory server (dirsrv).
Configuring Kerberos KDC (krb5kdc). Estimated time: 30 seconds
 [1/10]: adding sasl mappings to the directory
 [2/10]: adding kerberos container to the directory
 [3/10]: configuring KDC
 [4/10]: initialize kerberos container
WARNING: Your system is running out of entropy, you may experience long delays
 [5/10]: adding default ACIs
 [6/10]: creating a keytab for the directory
 [7/10]: creating a keytab for the machine
 [8/10]: adding the password extension to the directory
 [9/10]: starting the KDC
 [10/10]: configuring KDC to start on boot
Done configuring Kerberos KDC (krb5kdc).
Configuring kadmin
 [1/2]: starting kadmin 
 [2/2]: configuring kadmin to start on boot
Done configuring kadmin.
Configuring ipa_memcached
 [1/2]: starting ipa_memcached 
 [2/2]: configuring ipa_memcached to start on boot
Done configuring ipa_memcached.
Configuring ipa-otpd
 [1/2]: starting ipa-otpd 
 [2/2]: configuring ipa-otpd to start on boot
Done configuring ipa-otpd.
Configuring the web interface (httpd). Estimated time: 1 minute
 [1/19]: setting mod_nss port to 443
 = часть вывода скрыта =
 [19/19]: configuring httpd to start on boot
Done configuring the web interface (httpd).
Applying LDAP updates
Upgrading IPA:
 [1/9]: stopping directory server
 [2/9]: saving configuration
 [3/9]: disabling listeners
 [4/9]: enabling DS global lock
 [5/9]: starting directory server
 [6/9]: upgrading server
 [7/9]: stopping directory server
 [8/9]: restoring configuration
 [9/9]: starting directory server
Done.
Restarting the directory server
Restarting the KDC
Configuring DNS (named)
 [1/12]: generating rndc key file
 [2/12]: adding DNS container
 [3/12]: setting up our zone
 [4/12]: setting up reverse zone
 [5/12]: setting up our own record
 [6/12]: setting up records for other masters
 [7/12]: adding NS record to the zones
 [8/12]: setting up CA record
 [9/12]: setting up kerberos principal
 [10/12]: setting up named.conf
 [11/12]: configuring named to start on boot
 [12/12]: changing resolv.conf to point to ourselves
Done configuring DNS (named).
Configuring DNS key synchronization service (ipa-dnskeysyncd)
 [1/7]: checking status
 [2/7]: setting up bind-dyndb-ldap working directory
 [3/7]: setting up kerberos principal
 [4/7]: setting up SoftHSM
 [5/7]: adding DNSSEC containers
 [6/7]: creating replica keys
 [7/7]: configuring ipa-dnskeysyncd to start on boot
Done configuring DNS key synchronization service (ipa-dnskeysyncd).
Restarting ipa-dnskeysyncd
Restarting named
Restarting the web server
==============================================================
Установка завершена

Следующие шаги:
1. Вы должны убедиться, что эти порты открыты:
 TCP Ports:
 * 80, 443: HTTP/HTTPS
 * 389, 636: LDAP/LDAPS
 * 88, 464: kerberos
 * 53: bind
 UDP Ports:
 * 88, 464: kerberos
 * 53: bind
 * 123: ntp

Установка и конфигурирование закончено осталось выполнить требуемые действия указанные в логе установки.

Настройка FirewallD

О детальной настройке FirewallD вы можете посмотреть в статье «FirewallD базовая настройка«. Упуская детали я лишь добавлю все необходимые сервисы и порты.

Откроем необходимые порты и применим правила:

Для тестов лучше вообще не включать! При установке минимальной версии защиты нет!

firewall-cmd --permanent --zone=public --add-service={ntp,http,https,ldap,ldaps,kerberos,kpasswd,dns}
firewall-cmd --permanent --zone=public --add-port=53/tcp
firewall-cmd --permanent --zone=public --add-port=53/udp
firewall-cmd --reload
Результат после каждой команды должен быть -- success!

Проверим зону в которой работает система:

firewall-cmd --list-all --zone=public
= вывод команды =
 public (active)
 target: default
 icmp-block-inversion: no
 interfaces: eth0
 sources:
 services: ssh ntp http https ldap ldaps kerberos kpasswd dns
 ports: 53/tcp 53/udp
 protocols:
 masquerade: no
 forward-ports:
 source-ports:
 icmp-blocks:
 rich rules:

Всё хорошо. Все необходимые сервисы и порты открыты.

Проверка после установки

Получить билет kerberos с помощью команды:

kinit admin
= вывод команды =
 Password for admin@SEVO44.LOC: ********

Проверим полученный билет:

klist
= вывод команды =
 Ticket cache: KEYRING:persistent:0:0
 Default principal: admin@SEVO44.LOC

Valid starting Expires Service principal
 26.07.2016 02:47:02 27.07.2016 02:46:51 krbtgt/SEVO44.LOC@SEVO44.LOC

Как видим всё работает.

Добавление параметра DNS

Для того чтобы нам войти в панель управления по адресу ipa.sevo44.loc нам необходимо добавить нужный параметр в настройки DHCP сервера или добавить строчку в файл /etc/hosts на компьютере с которого хотим войти.

vi /etc/hosts
= необходимое изменении =
192.168.0.102 ipa.sevo44.loc

В моем случае работает DHCP сервер в сети под управлением CentOS 7 и мне необходимо было внести необходимые данные и перезагрузить службу:

vi /etc/dhcp/dhcpd.conf 
= вывод команды с требуемым параметром =
subnet 192.168.0.0 netmask 255.255.255.0 {
 option domain-name "sevo44.loc";
 option domain-name-servers 192.168.0.102;
 range 192.168.0.150 192.168.0.220;
 option routers 192.168.0.106;
 option subnet-mask 255.255.255.0;
 option broadcast-address 192.168.0.255;
 option ntp-servers 192.168.0.106;
 # PXE SERVER IP
 next-server 192.168.0.106;
 filename "pxelinux.0";
 }
systemctl restart dhcpd

Добавление аватара в базу LDAP

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

Получаем билет пользователя которому добавим аватар:

kinit sevo44
= вывод команды =
Password for sevo44@SEVO44.LOC: 
Password expired. You must change it now.
Enter new password: ******
Enter it again: ******

Проверим результат:

klist
= вывод команды =
Ticket cache: KEYRING:persistent:0:krb_ccache_eDplsFs
Default principal: sevo44@SEVO44.LOC

Valid starting Expires Service principal
06.10.2017 19:08:09 07.10.2017 19:08:09 krbtgt/SEVO44.LOC@SEVO44.LOC

Выведем информацию о пользователе:

ipa user-show --all sevo44
= вывод команды =
 dn: uid=sevo44,cn=users,cn=accounts,dc=sevo44,dc=loc
 Логин пользователя: sevo44
 Имя: Алексей
 Фамилия: Долотов
 Полное имя: Алексей Долотов
 Отображаемое имя: Алексей Долотов
 Инициалы: АД
 Домашний каталог: /home/sevo44
 GECOS: Алексей Долотов
 Оболочка входа: /bin/sh
 Principal name: sevo44@SEVO44.LOC
 Principal alias: sevo44@SEVO44.LOC
 Электронный адрес: info@sevo44.ru
 UID: 934400001
 ID группы: 934400001
 Должность:
 Учетная запись отключена: False
 Preserved user: False
 Пароль: True
 Member of groups: admincloud, ipausers, admin
 Kerberos ключей доступно: True
 ipauniqueid: f1f4385a-a115-11e7-98ed-36ef55e202fa
 krblastpwdchange: 20171006160809Z
 krbpasswordexpiration: 20180104160809Z
 objectclass: top, person, organizationalperson, inetorgperson, inetuser,
 posixaccount, krbprincipalaux, krbticketpolicyaux, ipaobject,
 ipasshuser, ipaSshGroupOfPubKeys, mepOriginEntry,
 ipauserauthtypeclass

Создадим файл файл Ldif где укажем нужные параметры и откуда брать файл аватара:

vim sevo44.ldif
= необходимые параметры =
dn: uid=sevo44,cn=users,cn=accounts,dc=sevo44,dc=loc
changetype: modify
add: jpegPhoto
jpegPhoto:< file:///root/avatar_sevo44_250.jpg

Предварительно закидываем нужный файл аватарки в требуемую папку.

LDAP не сохраняет изображения в качестве стандартного файла JPEG, он будет преобразован в base64. Рекомендуется использовать небольшое изображение, который вы будете хранить в LDAP.

Чтобы импортировать изображения в базу LDAP, используем команду ldapmodify:

ldapmodify -h ipa.sevo44.loc -p 389 -x -D "cn=Directory Manager" -W -f sevo44.ldif
= вывод команды =
Enter LDAP Password: ******
modifying entry "uid=sevo44,cn=users,cn=accounts,dc=sevo44,dc=loc"

Проверим правильность добавления аватарки в базу LDAP:

ipa user-show --all sevo44
= вывод команды =
 dn: uid=sevo44,cn=users,cn=accounts,dc=sevo44,dc=loc
 Логин пользователя: sevo44
 Имя: Алексей
 Фамилия: Долотов
 Полное имя: Алексей Долотов
 Отображаемое имя: Алексей Долотов
 Инициалы: АД
 Домашний каталог: /home/sevo44
 GECOS: Алексей Долотов
 Оболочка входа: /bin/sh
 Principal name: sevo44@SEVO44.LOC
 Principal alias: sevo44@SEVO44.LOC
 Электронный адрес: info@sevo44.ru
 UID: 934400001
 ID группы: 934400001
 Должность:
 Учетная запись отключена: False
 Preserved user: False
 Пароль: True
 Member of groups: admincloud, ipausers, admin
 Kerberos ключей доступно: True
 ipauniqueid: f1f4385a-a115-11e7-98ed-36ef55e202fa
 jpegphoto: /9j/4AAQSkZJRgABAQAAAQABAAD//gA7Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcgSlBFRyB2NjIpLCBxdWFsaXR5ID0gOTAK/9sAQwADAgIDAgIDAwMDBAMDBAUIBQUEBAUKBwcGCAwKDAwLCgsLDQ4SEA0OEQ4LCxAWEBETFBUVFQwPFxgWFBgSFBUU/9sAQwEDBAQFBAUJBQUJFA0LDRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU/8AAEQgAIAAgAwEiAAmY9N1nxffXhmjcw63Mj2+0IwY8Ox3ghcHuGb7u0ZUYKC0NKtaVdpyP//Z
 krblastpwdchange: 20171006160809Z
 krbpasswordexpiration: 20180104160809Z
 objectclass: top, person, organizationalperson, inetorgperson, inetuser, posixaccount, krbprincipalaux, krbticketpolicyaux, ipaobject, ipasshuser,
 ipaSshGroupOfPubKeys, mepOriginEntry, ipauserauthtypeclass

Видим что всё добавилось. Теперь на всех ресурсах подключенных к LDAP мы сможем видеть аватары пользователей что весьма удобно в работе.

По такому же принципу можно добавлять аватарки в любую базу LDAP.

Работа в панели FreeIPA

Панель FreeIPA выглядит очень дружелюбно и притом некоторые вещи показывает по русски что весьма радует. Так выглядит главная страница после авторизации:

freeipa_sevo44_1

На скрине ниже мы можем посмотреть куда настроено перенаправление если нет нужной записи в нашем DNS сервере:

freeipa_sevo44_6

В моем случае указаны DNS адреса google.

Добавление локальных хостов (сайтов) в DNS

Так выглядят все зоны DNS что обслуживаются в нашей локальной сети:

freeipa_sevo44_4

freeipa_sevo44_5

Добавление сводится к тому что надо нажать кнопку сверху справа «Добавить» и внести запись A указав название и ip адрес на котором находится ресурс:

freeipa_sevo44_7

Вот так все просто и наглядно и главное все показано в полном объеме необходимого функционала для обслуживание DNS сервера.

Добавление новой сторонней зоны DNS

Частенько когда в локальной сети работает ресурс он имеет доступ и с интернета. В моем случае это ресурс NextCloud к которому у меня настроен доступ как в локальной сети так и с интернета. Необходимо настроить чтобы находясь в локальной сети я работал на прямую с локальным ресурсом а когда работаю в других сетях доступ был через интернет и при этой чтобы ничего не переключать и не настраивать. Всё что нам надо это добавить новую зону и указать с какого IP ей работать если я подключен в локальную сеть.

Чтобы добавить нужную A запись после добавления зоны надо нажать на @ и внести нужный IP адрес.

freeipa_sevo44_2

Вывод

Мне понравилось оформление панели управление и тот функционал что я использую. Пробовал я разные варианты но этот для меня оказался самый лучший и главное стабильно работающий. Возможности большие и в документации вы сможете найти ответы на многие вопросы по работе с ним. Возможно в последствии я опишу как добавлять в домен машины как под управление Linux так и под управлением Windows. Исходя из последних ситуацией у моих клиентов чувствую что основной парк машин буду переводить на Linux. Уж больно достало всех уже «стабильность» систем Windows (особенно последней версии Windows 10 для которой матерные слова это уже самое малое что можно сказать).

Понравилась статья? Поделитесь ей с друзьями!
Пожалуйста, оставляйте свои комментарии

Читая их я получаю информацию которая позволяет мне улучшить качество написания статей. Кроме того, оставляя комментарии вы помогаете сайту получить более высокий рейтинг у поисковых систем. Давайте общаться.

11 комментариев для статьи “FreeIPA установка на CentOS 7

  1. Привет! немного добавление для статьи 🙂

    Сертификат для cockpit для клиентской машины, подписанный FreeIPA

    На «клиентской» машине есть cockpit. И на попытку открыть, он ругается на некорректный сертификат. Логично, его просто нужно сделать. Итак…

    Делаем закрытый ключик

    openssl genrsa -out client.key 1024

    Теперь делаем сертификат-запрос

    openssl req -new -key client.key -out client.csr

    Выводим содержимое в консоль

    cat client.csr

    В FreeIPA идем в

    Identify — Службы — добавляем сервис http для клиентского узла.

    Далее кликаем на

    HTTP/имя узла

    Там нажимаем Action (вверху слева) и добавляем содержимое client.csr

    ——BEGIN CERTIFICATE REQUEST——
    MIIByTCCATICAQAwgYgxCzAJBgNVBAYTAlJVMQ8wDQYDVQQIDAZNb3Njb3cxFDAS
    ….
    gZqeQrYMa7+Nj9RmJnE6HYpTGob6LwnzVE8Mq2w=
    ——END CERTIFICATE REQUEST——

    Справа на этой же странице в Service Certificate появится уже подписанный «ответ». Нажимаем Action и Get. Сохраняем как client.cert

    А теперь добавим закрытый ключик в этот же файл, так как cockpit хочет 1 файлик

    cat client.key >> client.cert

    И копируем его в cockpit

    cp client.cert /etc/cockpit/ws-certs.d/

    Далее перезапуск cockpit

    systemctl restart cockpit

    И в браузере «зелень». Если что-то не так, смотрим лог

    journalctl -u cockpit -f

  2. Клиент не добавляется , использую Rosa Fresh r10 , пишет «Failed to add CA to temporary NSS database.»

  3. почему то не могу авторизоваться в веб. интерфейсе FREEIPA

    В каком виде нужно вводить логин на примере домена lindomain.loc?
    Какой браузер использовать — есть ли ньюансы?
    admin@lindomain.loc
    admin@LINDOMAIN.LOC
    admin
    lindomainadmin
    LINDOMAINadmin
    LINDOMAINADMIN
    команда kinit, klist отрабатывает нормально.
    Что посоветуете ?

    1. При выполнении команды ipa-server-install вы вводили пароль при запросе «IPA сервер требует права администратора, по имени ‘admin’. Этот пользователь является регулярным системе учётная запись, используемая для управления IPA сервера.» Авторизуюсь в любом браузером указав в качестве логина admin.
      Если страницу главную видите и не проходит авторизация сразу после установки значит неверно указывайте пароль.
      Возможно проблема в том что не указали пароль как рекомендовано «Пароль должен быть минимум 8 символов.»

  4. А самое главное где? Как можно использовать эту базу данных ldap? Для авторизации на компах, в сетевых шарах, где-то еще может быть? С почтой как-то можно связать? Понятно, что все это можно, а есть какие-то примеры?

    1. Примеров пока нет, но будут. В личной практике пока использую связку с NextCloud. Вводил Windows 10 в домен и CentOS и Fedora. В российском дистрибутиве Rosa FreeIPA взята как основа для сервера AD (по крайней мере в документации часто упоминается). Ну а где использовать тут важно захотеть внедрять и главное желание директоров. Страх ухода от Windows тупо закрывает здравый смысл. Дело привычки штука сильная.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *