Поскольку я обновился до Debian Bullseye, клиенты nfs перестали работать:
# mount -vvt nfs4 -o sec=krb5 nfs11:/srv /mnt
mount.nfs4: тайм-аут установлен на среду, 15 сентября, 20:25:49 2021 г.
mount.nfs4: пробуем текстовые опции 'sec=krb5,vers=4.2,addr=x.y.11.63, clientaddr=x.y.11.42'
mount.nfs4: mount(2): Отказано в доступе
mount.nfs4: доступ запрещен сервером при монтировании nfs11:/srv
Когда я устанавливаю ядро 5.9 (linux-image-5.9.0-0.bpo.5-cloud-amd64) в той же системе - все работает.
Я также пробовал:
- Debian Testing Kernel (ядро 5.14) - не работает
- Ubuntu 21.10 Impish (ядро 5.13) - не работает
- Ubuntu 20.04 Focal (ядро 5.4) - работает
При условии, что все системы имеют одинаковую настройку NFS/Kerberos, мой вывод: что-то изменилось в ядре, что не позволяет монтировать общие ресурсы NFS/Kerberos.
- Мой KDC - Samba4 AD
- Мои настройки Kerberos и NFS довольно стандартны, как и в любом практическом руководстве.
- HOSTNAME$@REALM nfs/fqdn@REALM host/...принципы есть в клиенте и на вкладке сервера
я кладу RPCGSSDOPTS="-vvv"
в /etc/default/nfs-common для отладки. В следующих журналах:
- nfs11 — мой тестовый сервер nfs (Debian 11, ядро 5.10)
- tst2 — мой тестовый клиент nfs (Debian 11)
Вот системный журнал, когда клиент пытается смонтировать общий ресурс nfs:
клиент nfs загружается с ядром 5.9 (успешно монтируется)
rpc.gssd[446]: #012handle_gssd_upcall: 'mech=krb5 uid=0 service=* enctypes=18,17,16,23,3,1,2' (nfs/clnt0)
rpc.gssd[446]: krb5_use_machine_creds: uid 0 tgtname (null)
rpc.gssd[446]: полное имя хоста для nfs11.my.domain — nfs11.my.domain.
rpc.gssd[446]: полное имя хоста для tst2.my.domain — tst2.my.domain.
rpc.gssd[446]: успешно получена запись таблицы ключей для «[email protected]»
rpc.gssd[446]: gssd_get_single_krb5_cred: принципал '[email protected]' ccache: 'FILE:/tmp/krb5ccmachine_MY.DOMAIN'
rpc.gssd[446]: ИНФОРМАЦИЯ: учетные данные в CC 'FILE:/tmp/krb5ccmachine_MY.DOMAIN' действительны до 1631755378.
rpc.gssd[446]: создание TCP-клиента для сервера nfs11.my.domain
rpc.gssd[446]: DEBUG: порт уже установлен на 2049
rpc.gssd[446]: создание контекста с сервером [email protected]
rpc.gssd[446]: выполнение нисходящего вызова: life_rec=36000 [email protected]
rpc.gssd[446]: #012handle_gssd_upcall: 'mech=krb5 uid=0 enctypes=18,17,16,23,3,1,2' (nfs/clnt0)
rpc.gssd[446]: krb5_use_machine_creds: uid 0 tgtname (null)
rpc.gssd[446]: полное имя хоста для nfs11.my.domain — nfs11.my.domain.
rpc.gssd[446]: полное имя хоста для tst2.my.domain — tst2.my.domain.
rpc.gssd[446]: успешно получена запись таблицы ключей для «[email protected]»
rpc.gssd[446]: ИНФОРМАЦИЯ: учетные данные в CC 'FILE:/tmp/krb5ccmachine_MY.DOMAIN' действительны до 1631755378.
rpc.gssd[446]: ИНФОРМАЦИЯ: учетные данные в CC 'FILE:/tmp/krb5ccmachine_MY.DOMAIN' действительны до 1631755378.
rpc.gssd[446]: создание TCP-клиента для сервера nfs11.my.domain
rpc.gssd[446]: DEBUG: порт уже установлен на 2049
rpc.gssd[446]: создание контекста с сервером [email protected]
rpc.gssd[446]: выполнение нисходящего вызова: life_rec=36000 [email protected]
nfsidmap[524]: ключ: 0x3b88d120 тип: значение uid: [email protected] время ожидания 600
nfsidmap[524]: nfs4_name_to_uid: вызов nsswitch->name_to_uid
nfsidmap[524]: nss_getpwnam: имя '[email protected]' домен 'my.domain': результирующее локальное имя 'root'
nfsidmap[524]: nfs4_name_to_uid: nsswitch->name_to_uid вернул 0
nfsidmap[524]: nfs4_name_to_uid: окончательное возвращаемое значение равно 0
nfsidmap[525]: ключ: 0x317cb571 тип: значение gid: [email protected] время ожидания 600
nfsidmap[525]: nfs4_name_to_gid: вызов nsswitch->name_to_gid
nfsidmap[525]: nfs4_name_to_gid: nsswitch->name_to_gid вернул 0
nfsidmap[525]: nfs4_name_to_gid: окончательное возвращаемое значение равно 0
клиент nfs загружается с ядром 5.10 (не монтируется)
rpc.gssd[450]: #012handle_gssd_upcall: 'mech=krb5 uid=0 service=* enctypes=18,17,16,3,1,2' (nfs/clnt3)
rpc.gssd[450]: krb5_use_machine_creds: uid 0 tgtname (null)
rpc.gssd[450]: полное имя хоста для nfs11.my.domain — nfs11.my.domain.
rpc.gssd[450]: полное имя хоста для tst2.my.domain — tst2.my.domain.
rpc.gssd[450]: успешно получена запись таблицы ключей для «[email protected]»
rpc.gssd[450]: gssd_get_single_krb5_cred: принципал '[email protected]' ccache: 'FILE:/tmp/krb5ccmachine_MY.DOMAIN'
rpc.gssd[450]: ИНФОРМАЦИЯ: Учетные данные в CC 'FILE:/tmp/krb5ccmachine_MY.DOMAIN' действительны до 1631656676.
rpc.gssd[450]: ИНФОРМАЦИЯ: учетные данные в CC 'FILE:/tmp/krb5ccmachine_MY.DOMAIN' действительны до 1631629984.
rpc.gssd[450]: создание TCP-клиента для сервера nfs11.my.domain
rpc.gssd[450]: DEBUG: порт уже установлен на 2049
rpc.gssd[450]: создание контекста с сервером [email protected]
rpc.gssd[450]: ПРЕДУПРЕЖДЕНИЕ. Не удалось создать контекст krb5 для пользователя с uid 0 для сервера [email protected].
rpc.gssd[450]: ПРЕДУПРЕЖДЕНИЕ: не удалось создать контекст krb5 машины с кешем cred. ФАЙЛ:/tmp/krb5ccmachine_MY.DOMAIN для сервера nfs11.my.domain.
rpc.gssd[450]: создание TCP-клиента для сервера nfs11.my.domain
rpc.gssd[450]: DEBUG: порт уже установлен на 2049
rpc.gssd[450]: создание контекста с сервером [email protected]
rpc.gssd[450]: ПРЕДУПРЕЖДЕНИЕ. Не удалось создать контекст krb5 для пользователя с uid 0 для сервера [email protected].
rpc.gssd[450]: ПРЕДУПРЕЖДЕНИЕ: не удалось создать контекст krb5 машины с кешем cred. ФАЙЛ:/tmp/krb5ccmachine_MY.DOMAIN для сервера nfs11.my.domain.
rpc.gssd[450]: ПРЕДУПРЕЖДЕНИЕ. Кэш компьютера преждевременно истек или поврежден при попытке воссоздать кеш для сервера nfs11.my.domain.
rpc.gssd[450]: полное имя хоста для nfs11.my.domain — nfs11.my.domain.
rpc.gssd[450]: полное имя хоста для tst2.my.domain — tst2.my.domain.
rpc.gssd[450]: успешно получена запись таблицы ключей для «[email protected]»
rpc.gssd[450]: ИНФОРМАЦИЯ: Учетные данные в CC 'FILE:/tmp/krb5ccmachine_MY.DOMAIN' действительны до 1631656676.
rpc.gssd[450]: ИНФОРМАЦИЯ: Учетные данные в CC 'FILE:/tmp/krb5ccmachine_MY.DOMAIN' действительны до 1631656676.
rpc.gssd[450]: ИНФОРМАЦИЯ: учетные данные в CC 'FILE:/tmp/krb5ccmachine_MY.DOMAIN' действительны до 1631629984.
rpc.gssd[450]: создание TCP-клиента для сервера nfs11.my.domain
rpc.gssd[450]: DEBUG: порт уже установлен на 2049
rpc.gssd[450]: создание контекста с сервером [email protected]
rpc.gssd[450]: ПРЕДУПРЕЖДЕНИЕ. Не удалось создать контекст krb5 для пользователя с uid 0 для сервера [email protected].
rpc.gssd[450]: ПРЕДУПРЕЖДЕНИЕ: не удалось создать контекст krb5 машины с кешем cred. ФАЙЛ:/tmp/krb5ccmachine_MY.DOMAIN для сервера nfs11.my.domain.
rpc.gssd[450]: создание TCP-клиента для сервера nfs11.my.domain
rpc.gssd[450]: DEBUG: порт уже установлен на 2049
rpc.gssd[450]: создание контекста с сервером [email protected]
rpc.gssd[450]: ПРЕДУПРЕЖДЕНИЕ. Не удалось создать контекст krb5 для пользователя с uid 0 для сервера [email protected].
rpc.gssd[450]: ПРЕДУПРЕЖДЕНИЕ: не удалось создать контекст krb5 машины с кешем cred. ФАЙЛ:/tmp/krb5ccmachine_MY.DOMAIN для сервера nfs11.my.domain.
rpc.gssd[450]: ОШИБКА: не удалось создать контекст машины krb5 с любым кешем учетных данных для сервера nfs11.my.domain
rpc.gssd[450]: выполняется сброс ошибок
Я много гуглил и не нашел ничего похожего...
В настоящее время в качестве обходного пути я запускаю резервное ядро из предыдущего выпуска во всех клиентских системах nfs. Но я думаю, что это опасно, и что-то мне подсказывает, что он может сломаться в любой момент.
Кто-нибудь сталкивался с такой проблемой? Может быть, я должен что-то настроить, чтобы соответствовать изменениям в ядре? Может стоит залить баг ядра?
ОБНОВИТЬ. Добавлены журналы KDC.
KDC при монтировании с клиента с ядром 5.9 - успешно
[2021/09/21 21:55:12.061264, 3] ../../source4/smbd/service_stream.c:67(stream_terminate_connection)
stream_terminate_connection: Завершение соединения — «dcesrv: NT_STATUS_CONNECTION_DISCONNECTED»
[2021/09/21 21:55:44.743415, 3] ../../source4/auth/kerberos/krb5_init_context.c:80(smb_krb5_debug_wrapper)
Kerberos: AS-REQ [email protected] из ipv4:x.y.11.42:38701 для krbtgt/[email protected]
[2021/09/21 21:55:44.747105, 3] ../../source4/auth/kerberos/krb5_init_context.c:80(smb_krb5_debug_wrapper)
Kerberos: клиент отправил типы: 150, 149
[2021/09/21 21:55:44.747154, 3] ../../source4/auth/kerberos/krb5_init_context.c:80(smb_krb5_debug_wrapper)
Kerberos: поиск pa-данных PKINIT -- [email protected]
[2021/09/21 21:55:44.747178, 3] ../../source4/auth/kerberos/krb5_init_context.c:80(smb_krb5_debug_wrapper)
Kerberos: поиск pa-данных ENC-TS -- [email protected]
[2021/09/21 21:55:44.747209, 3] ../../source4/auth/kerberos/krb5_init_context.c:80(smb_krb5_debug_wrapper)
Kerberos: Предварительная аутентификация не найдена, возвращается PREAUTH-REQUIRED -- [email protected]
[2021/09/21 21:55:44.751030, 3] ../../source4/auth/kerberos/krb5_init_context.c:80(smb_krb5_debug_wrapper)
Kerberos: AS-REQ [email protected] из ipv4:x.y.11.42:50506 для krbtgt/[email protected]
[2021/09/21 21:55:44.753959, 3] ../../source4/auth/kerberos/krb5_init_context.c:80(smb_krb5_debug_wrapper)
Kerberos: клиент отправлял патипы: зашифрованная временная метка, 150, 149
[2021/09/21 21:55:44.754060, 3] ../../source4/auth/kerberos/krb5_init_context.c:80(smb_krb5_debug_wrapper)
Kerberos: поиск pa-данных PKINIT -- [email protected]
[2021/09/21 21:55:44.754114, 3] ../../source4/auth/kerberos/krb5_init_context.c:80(smb_krb5_debug_wrapper)
Kerberos: поиск pa-данных ENC-TS -- [email protected]
[2021/09/21 21:55:44.754187, 3] ../../source4/auth/kerberos/krb5_init_context.c:80(smb_krb5_debug_wrapper)
Kerberos: предварительная аутентификация ENC-TS прошла успешно -- [email protected] с использованием arcfour-hmac-md5
[2021/09/21 21:55:44.754275, 3] ../../auth/auth_log.c:635(log_authentication_event_human_readable)
Аутентификация: [Kerberos KDC, ENC-TS Pre-authentication] user [(null)]\[[email protected]] в [вторник, 21 сентября 2021 г., 21:55:44.754261 +06] с [arcfour-hmac-md5 ] статус [NT_STATUS_OK] рабочая станция [(null)] удаленный хост [ipv4:x.y.11.42:50506] стал [MYDOM]\[tst2$] [S-1-5-21-3408476796-3867293677-901807371-6619]. локальный хост [NULL]
{"отметка времени": "2021-09-21T21:55:44.754359+0600", "тип": "Аутентификация", "Аутентификация": {"версия": {"основная": 1, "дополнительная": 2}, "eventId": 4624, "logonId": "dd24014b273cc7a8", "logonType": 3, "status": "NT_STATUS_OK", "localAddress": null, "remoteAddress": "ipv4:xy11.42:50506", "serviceDescription" : "Kerberos KDC", "authDescription": "Предварительная аутентификация ENC-TS", "clientDomain": null, "clientAccount": "[email protected]", "workstation": null, "becameAccount": "tst2 $", "becameDomain": "MYDOM", "becameSid": "S-1-5-21-3408476796-3867293677-901807371-6619", "mappedAccount": "tst2$", "mappedDomain": "MYDOM", "netlogonComputer": null, "netlogonTrustAccount": null, "netlogonNegotiateFlags": "0x00000000", "netlogonSecureChannelType": 0, "netlogonTrustAccountSid": null, "passwordType": "arcfour-hmac-md5", "duration": 3366} }
[2021/09/21 21:55:44.761108, 3] ../../source4/auth/kerberos/krb5_init_context.c:80(smb_krb5_debug_wrapper)
Kerberos: время аутентификации AS-REQ: 2021-09-21T21:55:44 время начала: не установлено время окончания: 2021-09-22T07:55:44 продлить до: 2021-09-22T21:55:44
[2021/09/21 21:55:44.761282, 3] ../../source4/auth/kerberos/krb5_init_context.c:80(smb_krb5_debug_wrapper)
Kerberos: поддерживаемые клиентом типы enctype: arcfour-hmac-md5, aes128-cts-hmac-sha1-96, aes256-cts-hmac-sha1-96, использование arcfour-hmac-md5/arcfour-hmac-md5
[2021/09/21 21:55:44.761368, 3] ../../source4/auth/kerberos/krb5_init_context.c:80(smb_krb5_debug_wrapper)
Kerberos: запрошенные флаги: возобновляемый-ок, пересылаемый
[2021/09/21 21:55:44.767382, 3] ../../source4/auth/kerberos/krb5_init_context.c:80(smb_krb5_debug_wrapper)
Kerberos: TGS-REQ [email protected] от ipv4:x.y.11.42:39570 для nfs/[email protected] [канонизировать, возобновлять, пересылать]
[2021/09/21 21:55:44.773999, 3] ../../source4/auth/kerberos/krb5_init_context.c:80(smb_krb5_debug_wrapper)
Kerberos: TGS-REQ authtime: 2021-09-21T21:55:44 starttime: 2021-09-21T21:55:44 endtime: 2021-09-22T07:55:44 продлить до: 2021-09-22T21:55:44
[2021/09/21 21:55:44.774695, 3] ../../source4/smbd/service_stream.c:67(stream_terminate_connection)
stream_terminate_connection: Завершение соединения - 'kdc_tcp_call_loop: tstream_read_pdu_blob_recv() - NT_STATUS_CONNECTION_DISCONNECTED'
KDC при монтировании с клиента с ядром 5.10 - не удалось смонтировать
[2021/09/22 00:31:39.893723, 3] ../../source4/auth/kerberos/krb5_init_context.c:80(smb_krb5_debug_wrapper)
Kerberos: AS-REQ [email protected] из ipv4:x.y.11.42:46094 для krbtgt/[email protected]
[2021/09/22 00:31:39.899112, 3] ../../source4/auth/kerberos/krb5_init_context.c:80(smb_krb5_debug_wrapper)
Kerberos: клиент отправил типы: 150, 149
[2021/09/22 00:31:39.899162, 3] ../../source4/auth/kerberos/krb5_init_context.c:80(smb_krb5_debug_wrapper)
Kerberos: поиск pa-данных PKINIT -- [email protected]
[2021/09/22 00:31:39.899186, 3] ../../source4/auth/kerberos/krb5_init_context.c:80(smb_krb5_debug_wrapper)
Kerberos: поиск pa-данных ENC-TS -- [email protected]
[2021/09/22 00:31:39.899221, 3] ../../source4/auth/kerberos/krb5_init_context.c:80(smb_krb5_debug_wrapper)
Kerberos: Предварительная аутентификация не найдена, возвращается PREAUTH-REQUIRED -- [email protected]
[2021/09/22 00:31:39.901942, 3] ../../source4/auth/kerberos/krb5_init_context.c:80(smb_krb5_debug_wrapper)
Kerberos: AS-REQ [email protected] из ipv4:x.y.11.42:39303 для krbtgt/[email protected]
[2021/09/22 00:31:39.905030, 3] ../../source4/auth/kerberos/krb5_init_context.c:80(smb_krb5_debug_wrapper)
Kerberos: клиент отправлял патипы: зашифрованная временная метка, 150, 149
[2021/09/22 00:31:39.905080, 3] ../../source4/auth/kerberos/krb5_init_context.c:80(smb_krb5_debug_wrapper)
Kerberos: поиск pa-данных PKINIT -- [email protected]
[2021/09/22 00:31:39.905105, 3] ../../source4/auth/kerberos/krb5_init_context.c:80(smb_krb5_debug_wrapper)
Kerberos: поиск pa-данных ENC-TS -- [email protected]
[2021/09/22 00:31:39.905171, 3] ../../source4/auth/kerberos/krb5_init_context.c:80(smb_krb5_debug_wrapper)
Kerberos: предварительная аутентификация ENC-TS прошла успешно -- [email protected] с использованием arcfour-hmac-md5
[2021/09/22 00:31:39.905270, 3] ../../auth/auth_log.c:635(log_authentication_event_human_readable)
Аутентификация: [Kerberos KDC, ENC-TS Pre-authentication] user [(null)]\[[email protected]] в [ср, 22 сентября 2021 г., 00:31:39.905248 +06] с [arcfour-hmac-md5 ] статус [NT_STATUS_OK] рабочая станция [(null)] удаленный хост [ipv4:x.y.11.42:39303] стал [MYDOM]\[tst2$] [S-1-5-21-3408476796-3867293677-901807371-6621]. локальный хост [NULL]
{"отметка времени": "2021-09-22T00:31:39.905331+0600", "тип": "Аутентификация", "Аутентификация": {"версия": {"основная": 1, "дополнительная": 2}, "eventId": 4624, "logonId": "8511280d720bd92c", "logonType": 3, "status": "NT_STATUS_OK", "localAddress": null, "remoteAddress": "ipv4:xy11.42:39303", "serviceDescription" : "Kerberos KDC", "authDescription": "Предварительная аутентификация ENC-TS", "clientDomain": null, "clientAccount": "[email protected]", "workstation": null, "becameAccount": "tst2 $", "becameDomain": "MYDOM", "becameSid": "S-1-5-21-3408476796-3867293677-901807371-6621", "mappedAccount": "tst2$", "mappedDomain": "MYDOM", "netlogonComputer": null, "netlogonTrustAccount": null, "netlogonNegotiateFlags": "0x00000000", "netlogonSecureChannelType": 0, "netlogonTrustAccountSid": null, "passwordType": "arcfour-hmac-md5", "duration": 3429} }
[2021/09/22 00:31:39.912509, 3] ../../source4/auth/kerberos/krb5_init_context.c:80(smb_krb5_debug_wrapper)
Kerberos: время аутентификации AS-REQ: 2021-09-22T00:31:39 время начала: не установлено время окончания: 2021-09-22T10:31:39 продлить до: 2021-09-23T00:31:39
[2021/09/22 00:31:39.912597, 3] ../../source4/auth/kerberos/krb5_init_context.c:80(smb_krb5_debug_wrapper)
Kerberos: поддерживаемые клиентом типы enctype: arcfour-hmac-md5, aes128-cts-hmac-sha1-96, aes256-cts-hmac-sha1-96, использование arcfour-hmac-md5/arcfour-hmac-md5
[2021/09/22 00:31:39.912663, 3] ../../source4/auth/kerberos/krb5_init_context.c:80(smb_krb5_debug_wrapper)
Kerberos: запрошенные флаги: возобновляемый-ок, пересылаемый
[2021/09/22 00:31:39.918313, 3] ../../source4/auth/kerberos/krb5_init_context.c:80(smb_krb5_debug_wrapper)
Kerberos: TGS-REQ [email protected] от ipv4:xy.11.42:59850 для nfs/[email protected] [канонизировать, возобновлять, пересылать]
[2021/09/22 00:31:39.924869, 3] ../../source4/auth/kerberos/krb5_init_context.c:80(smb_krb5_debug_wrapper)
Kerberos: TGS-REQ authtime: 2021-09-22T00:31:39 starttime: 2021-09-22T00:31:39 endtime: 2021-09-22T10:31:39 продлить до: 2021-09-23T00:31:39
[2021/09/22 00:31:39.925340, 3] ../../source4/smbd/service_stream.c:67(stream_terminate_connection)
stream_terminate_connection: Завершение соединения - 'kdc_tcp_call_loop: tstream_read_pdu_blob_recv() - NT_STATUS_CONNECTION_DISCONNECTED'
[2021/09/22 00:31:39.928319, 3] ../../source4/auth/kerberos/krb5_init_context.c:80(smb_krb5_debug_wrapper)
Kerberos: TGS-REQ [email protected] от ipv4:xy.11.42:59852 для nfs/[email protected] [возобновляемый, пересылаемый]
[2021/09/22 00:31:39.930936, 3] ../../source4/auth/kerberos/krb5_init_context.c:80(smb_krb5_debug_wrapper)
Kerberos: сервер (nfs/[email protected]) не поддерживает etypes
[2021/09/22 00:31:39.930998, 3] ../../source4/auth/kerberos/krb5_init_context.c:80(smb_krb5_debug_wrapper)
Kerberos: не удалось создать TGS-REP для ipv4:xy.11.42:59852
[2021/09/22 00:31:39.931336, 3] ../../source4/smbd/service_stream.c:67(stream_terminate_connection)
stream_terminate_connection: Завершение соединения - 'kdc_tcp_call_loop: tstream_read_pdu_blob_recv() - NT_STATUS_CONNECTION_DISCONNECTED'
Я понимаю Сервер (nfs/[email protected]) не поддерживает etypes
ошибка. Google находит старые проблемы, связанные со старыми enctypes, ничего полезного. Все пакеты обновлены.
Я добился некоторого прогресса, благодаря комментариям. Я установил свежий Samba DC, подключил клиент (ядро 5.10) и сервер к новому KDC - и все заработало! Новый KDC позволяет клиентам NFS с любым ядром монтировать общие ресурсы. Похоже проблема в моем продакшене Samba DC. Я просмотрел базы данных ldap, и кажется, что они похожи, за исключением очень немногих дополнений к свежему контроллеру домена, таких как 3 новых объекта и некоторые поля. В настоящее время я не знаю, что мне следует настроить в производственном DC, чтобы он вел себя как новый. Переустановка будет последним средством, потому что это требует МНОГО времени.
Рабочий DC был создан давно, и несколько раз переносился с использованием стандартной репликации samba или резервных копий. Производство и свежая информация о DC:
- oEMИнформация: предоставлено SAMBA 4.1.6-Ubuntu.
- oEMInformation: Предоставлено SAMBA 4.13.5-Debian
В настоящее время контроллеры домена работают под управлением идентичных операционных систем Debian.
ОБНОВЛЕНИЕ 2. Решено!
Смотрите решение ниже.