Ошибка авторизации ldap

Эта функция доступна в версии Cloud Identity Premium. Сравнение версий 

В случае возникновения неполадок при выполнении запросов LDAP во время и после подключения LDAP-клиента сервис Secure LDAP возвращает коды ошибок. Доступность этих кодов ошибок конечным пользователям через LDAP-клиенты зависит от клиента. Описанные в этой статье коды также заносятся в журналы аудита.

PROTOCOL_ERROR (2)

  • Возвращается, если в запросе упоминается неподдерживаемая версия LDAP. Сервис Secure LDAP поддерживает LDAP версии 3.
  • Возвращается, если в запросе упоминается неподдерживаемое действие. Google поддерживает следующие действия: Abandon (Отменить), Bind (Привязать), Extended (Расширено) (для StartTLS), Search (Поиск) и Unbind (Отменить привязку). Неподдерживаемые действия: Add (Добавить), Compare (Сравнить), Del (Удалить), Modify (Изменить) и ModifyDn (Изменить уникальное имя).
  • Возвращается, если в запросе упоминается неподдерживаемый идентификатор заказа Oid. Действие Extended (Расширено) поддерживается Google только для StartTLS (Oid 1.3.6.1.4.1.1466.20037) через ранее не защищенное подключение.

​AUTH_METHOD_NOT_SUPPORTED (7)

  • Возвращается, если в запросе Bind упоминается неподдерживаемый метод аутентификации. Google поддерживает методы SIMPLE, SASL PLAIN, and SASL EXTERNAL.

ADMIN_LIMIT_EXCEEDED (11)

  • Возвращается при превышении квоты LDAP.о

CONFIDENTIALITY_REQUIRED (13)

  • Возвращается, если запрос SASL Bind отправляется через незащищенное подключение.
  • Возвращается, если действие Search запрашивает данные, не относящиеся к атрибутам сервера, и выполняется через незащищенное подключение.

NO_SUCH_OBJECT (32)

  • Возвращается при поиске несуществующего объекта (например, неизвестного пользователя, группы или организационного подразделения).
  • Возвращается при поиске идентификатора пользователя, которого нет в каталоге.

INVALID_DN_SYNTAX (34)

  • Возвращается, если уникальное имя некорректно и не поддается анализу JNDI. Подробную информацию можно найти на странице javax.naming.ldap.LdapName (только на английском языке).
  • Возвращается, если уникальное имя содержит атрибут со значением, не являющимся строковым. Поддерживаются только строковые значения. Подробную информацию можно найти на странице javax.naming.directory.Attribute (только на английском языке).

INAPPROPRIATE_AUTHENTICATION (48)

  • Возвращается, если в запросе Bind указан некорректный сертификат клиента или сертификат с истекшим сроком действия.
  • Возвращается, если в запросе SASL PLAIN Bind не указаны или указаны некорректные учетные данные.

​INSUFFICIENT_ACCESS_RIGHTS (50)

  • Возвращается, если сервис Secure LDAP отключен для LDAP-клиента.
  • Возвращается, если у клиента нет лицензии на использование сервиса Secure LDAP.
  • Возвращается, если в запросе Bind указан пользователь, у которого нет лицензии на использование сервиса Secure LDAP.
  • Возвращается, если в запросе Bind указан отключенный пользователь.
  • Возвращается, если в последующем запросе Bind (rebind) указан пользователь, не принадлежащий к организационному подразделению, для которого включена аутентификация в конфигурации Secure LDAP.
  • Возвращается, если в запросе SIMPLE Bind не указаны учетные данные (без аутентификации).

UNWILLING_TO_PERFORM (53)

  • Возвращается, если в запросе SIMPLE Bind не указаны учетные данные (без аутентификации).

​OTHER (80)

  • Эта ошибка возвращается при получении неожиданного результата по причине ошибки в коде. Если она у вас возникла, обратитесь в службу поддержки Google Workspace или службу поддержки Cloud Identity Premium.

CANCELED (118)

  • Возвращается, если запрос Abandon прервал текущую операцию LDAP.
     

Эта информация оказалась полезной?

Как можно улучшить эту статью?

0 Пользователей и 1 Гость просматривают эту тему.

  • 5 Ответов
  • 3767 Просмотров

Доброе утро.

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

Joomla 3,3,6 Свой сервак и тд и тп.
Сделана авторизация через LDAP, данные с доменного контроллера. Частично работает, некоторые пользователи заходят нормально без ошибок, пользователи нормально импортируются в базу Joomla. Но некоторые получают «Ошибка привязки к серверу LDAP» при первом входе. Визуально все пользователи в группе domain/Users (Пользователи домена), настройки Joomla
Хост: 192.168.0.248
Порт: 389
LDAP V3: Yes
Выполнять TLS: No
Следовать перенаправления: No
Метод авторизации: Привязать непосредственно к пользователю
Базовый DN: DC=9000let,DC=ru
Строка поиска: sAMAccountName=[search]
Пользовательний DN: [username]@9000let.ru
Имя полльзователя подключения: вася пупкин
Пароль хххх
Map Full name: displayName
Map email: mail
Map User ID: uid

кто может подсказать куда копать. Также вопрос возможно ли включить логи данного плагина что бы он скидывал ошибки куда-нить, а то дебажить без логов как то проблематично :(

« Последнее редактирование: 11.02.2015, 15:37:14 от b2z »

Записан

В общем разобрался. Проблема в том что в модуле LDAP нет события по ошибке ввода неверного логина или пароля. В файле переводов есть только JGLOBAL_AUTH_BIND_FAILED=»Ошибка привязки к серверу LDAP» и только это относится к авторизации через ldap (поковыряв коды плагина), считаю это немного некорректно, но тут уже упираемся в мост, он не получает от AD статуса что неверный пароль или же получает но не понимает и тупо возвращает эту ошибку. В общем решил проблему по методу костылей JGLOBAL_AUTH_BIND_FAILED=»Ошибка привязки к серверу LDAP. Неправильное имя пользователя или пароль» Ибо тут без вариантов, лдап либо работает либо нет, а если он не работат то тут уже значит лежит домен контроллер и разбираться нужно с ним:)Надеюсь кому-нить это поможет если будут такие же вопросы или проблемы.

Для чего вообще эта авторизация и что она дает посетителям сайта на Joomla?

Для чего вообще эта авторизация и что она дает посетителям сайта на Joomla?

Это полезная штука, если сайт работает в локальной сети предприятия

Для чего вообще эта авторизация и что она дает посетителям сайта на Joomla?

Полезность её в том что, человечки на сайте заходят со своими пользователями и паролями из AD, и это даёт много возможностей для более тонкой настройки локального сайта (форма, права и тд.)

В общем разобрался. Проблема в том что в модуле LDAP нет события по ошибке ввода неверного логина или пароля. В файле переводов есть только JGLOBAL_AUTH_BIND_FAILED=»Ошибка привязки к серверу LDAP» и только это относится к авторизации через ldap (поковыряв коды плагина), считаю это немного некорректно, но тут уже упираемся в мост, он не получает от AD статуса что неверный пароль или же получает но не понимает и тупо возвращает эту ошибку. В общем решил проблему по методу костылей JGLOBAL_AUTH_BIND_FAILED=»Ошибка привязки к серверу LDAP. Неправильное имя пользователя или пароль» Ибо тут без вариантов, лдап либо работает либо нет, а если он не работат то тут уже значит лежит домен контроллер и разбираться нужно с ним:)Надеюсь кому-нить это поможет если будут такие же вопросы или проблемы.

А ты у верен что в поле Map User ID: uid у тебя всё корректно вписано? Правильней было бы sAMAccountName

type stage group info

reference

Manage

Authentication and Authorization

To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments

Troubleshooting LDAP (FREE SELF)

If you are an administrator, use the following information to troubleshoot LDAP.

Common Problems & Workflows

Connection

Connection refused

If you’re getting Connection Refused error messages when attempting to
connect to the LDAP server, review the LDAP port and encryption settings
used by GitLab. Common combinations are encryption: 'plain' and port: 389,
or encryption: 'simple_tls' and port: 636.

Connection times out

If GitLab cannot reach your LDAP endpoint, you see a message like this:

Could not authenticate you from Ldapmain because "Connection timed out - user specified timeout".

If your configured LDAP provider and/or endpoint is offline or otherwise
unreachable by GitLab, no LDAP user is able to authenticate and sign-in.
GitLab does not cache or store credentials for LDAP users to provide authentication
during an LDAP outage.

Contact your LDAP provider or administrator if you are seeing this error.

Referral error

If you see LDAP search error: Referral in the logs, or when troubleshooting
LDAP Group Sync, this error may indicate a configuration problem. The LDAP
configuration /etc/gitlab/gitlab.rb (Omnibus) or config/gitlab.yml (source)
is in YAML format and is sensitive to indentation. Check that group_base and
admin_group configuration keys are indented 2 spaces past the server
identifier. The default identifier is main and an example snippet looks like
the following:

main: # 'main' is the GitLab 'provider ID' of this LDAP server
  label: 'LDAP'
  host: 'ldap.example.com'
  ...
  group_base: 'cn=my_group,ou=groups,dc=example,dc=com'
  admin_group: 'my_admin_group'

Query LDAP (PREMIUM SELF)

The following allows you to perform a search in LDAP using the rails console.
Depending on what you’re trying to do, it may make more sense to query a user
or a group directly, or even use ldapsearch instead.

adapter = Gitlab::Auth::Ldap::Adapter.new('ldapmain')
options = {
    # :base is required
    # use .base or .group_base
    base: adapter.config.group_base,

    # :filter is optional
    # 'cn' looks for all "cn"s under :base
    # '*' is the search string - here, it's a wildcard
    filter: Net::LDAP::Filter.eq('cn', '*'),

    # :attributes is optional
    # the attributes we want to get returned
    attributes: %w(dn cn memberuid member submember uniquemember memberof)
}
adapter.ldap_search(options)

When using OIDs in the filter, replace Net::LDAP::Filter.eq with Net::LDAP::Filter.construct:

adapter = Gitlab::Auth::Ldap::Adapter.new('ldapmain')
options = {
    # :base is required
    # use .base or .group_base
    base: adapter.config.base,

    # :filter is optional
    # This filter includes OID 1.2.840.113556.1.4.1941
    # It will search for all direct and nested members of the group gitlab_grp in the LDAP directory
    filter: Net::LDAP::Filter.construct("(memberOf:1.2.840.113556.1.4.1941:=CN=gitlab_grp,DC=example,DC=com)"),

    # :attributes is optional
    # the attributes we want to get returned
    attributes: %w(dn cn memberuid member submember uniquemember memberof)
}
adapter.ldap_search(options)

For examples of how this is run,
review the Adapter module.

User sign-ins

No users are found

If you’ve confirmed that a connection to LDAP can be
established but GitLab doesn’t show you LDAP users in the output, one of the
following is most likely true:

  • The bind_dn user doesn’t have enough permissions to traverse the user tree.
  • The users don’t fall under the configured base.
  • The configured user_filter blocks access to the users.

In this case, you con confirm which of the above is true using
ldapsearch with the existing LDAP configuration in your
/etc/gitlab/gitlab.rb.

Users cannot sign-in

A user can have trouble signing in for any number of reasons. To get started,
here are some questions to ask yourself:

  • Does the user fall under the configured base in
    LDAP? The user must fall under this base to sign in.
  • Does the user pass through the configured user_filter?
    If one is not configured, this question can be ignored. If it is, then the
    user must also pass through this filter to be allowed to sign in.

    • Refer to our documentation on debugging the user_filter.

If the above are both okay, the next place to look for the problem is
the logs themselves while reproducing the issue.

  • Ask the user to sign in and let it fail.
  • Look through the output for any errors or other
    messages about the sign-in. You may see one of the other error messages on
    this page, in which case that section can help resolve the issue.

If the logs don’t lead to the root of the problem, use the
rails console to query this user
to see if GitLab can read this user on the LDAP server.

It can also be helpful to
debug a user sync to
investigate further.

Invalid credentials on sign-in

If that the sign-in credentials used are accurate on LDAP, ensure the following
are true for the user in question:

  • Make sure the user you are binding with has enough permissions to read the user’s
    tree and traverse it.
  • Check that the user_filter is not blocking otherwise valid users.
  • Run an LDAP check command to make sure that the LDAP settings
    are correct and GitLab can see your users.

Access denied for your LDAP account

There is a bug that
may affect users with Auditor level access. When
downgrading from Premium/Ultimate, Auditor users who try to sign in
may see the following message: Access denied for your LDAP account.

We have a workaround, based on toggling the access level of affected users:

  1. As an administrator, on the top bar, select Main menu > Admin.
  2. On the left sidebar, select Overview > Users.
  3. Select the name of the affected user.
  4. In the upper-right corner, select Edit.
  5. Change the user’s access level from Regular to Administrator (or vice versa).
  6. At the bottom of the page, select Save changes.
  7. In the upper-right corner, select Edit again.
  8. Restore the user’s original access level (Regular or Administrator)
    and select Save changes again.

The user should now be able to sign in.

Email has already been taken

A user tries to sign in with the correct LDAP credentials, is denied access,
and the production.log shows an error that looks like this:

(LDAP) Error saving user <USER DN> (email@example.com): ["Email has already been taken"]

This error is referring to the email address in LDAP, email@example.com. Email
addresses must be unique in GitLab and LDAP links to a user’s primary email (as opposed
to any of their possibly-numerous secondary emails). Another user (or even the
same user) has the email email@example.com set as a secondary email, which
is throwing this error.

We can check where this conflicting email address is coming from using the
rails console. In the console, run the following:

# This searches for an email among the primary AND secondary emails
user = User.find_by_any_email('email@example.com')
user.username

This shows you which user has this email address. One of two steps must be taken here:

  • To create a new GitLab user/username for this user when signing in with LDAP,
    remove the secondary email to remove the conflict.
  • To use an existing GitLab user/username for this user to use with LDAP,
    remove this email as a secondary email and make it a primary one so GitLab
    associates this profile to the LDAP identity.

The user can do either of these steps
in their profile or an administrator can do it.

Projects limit errors

The following errors indicate that a limit or restriction is activated, but an associated data
field contains no data:

  • Projects limit can't be blank.
  • Projects limit is not a number.

To resolve this:

  1. On the top bar, select Main menu > Admin.
  2. On the left sidebar, go to Settings > General.
  3. Expand both of the following:
    • Account and limit.
    • Sign-up restrictions.
  4. Check, for example, the Default projects limit or Allowed domains for sign-ups
    fields and ensure that a relevant value is configured.

Debug LDAP user filter

ldapsearch allows you to test your configured
user filter
to confirm that it returns the users you expect it to return.

ldapsearch -H ldaps://$host:$port -D "$bind_dn" -y bind_dn_password.txt  -b "$base" "$user_filter" sAMAccountName
  • Variables beginning with a $ refer to a variable from the LDAP section of
    your configuration file.
  • Replace ldaps:// with ldap:// if you are using the plain authentication method.
    Port 389 is the default ldap:// port and 636 is the default ldaps://
    port.
  • We are assuming the password for the bind_dn user is in bind_dn_password.txt.

Sync all users (PREMIUM SELF)

The output from a manual user sync can show you what happens when
GitLab tries to sync its users against LDAP. Enter the rails console
and then run:

Rails.logger.level = Logger::DEBUG

LdapSyncWorker.new.perform

Next, learn how to read the output.

Example console output after a user sync (PREMIUM SELF)

The output from a manual user sync is very verbose, and a
single user’s successful sync can look like this:

Syncing user John, email@example.com
  Identity Load (0.9ms)  SELECT  "identities".* FROM "identities" WHERE "identities"."user_id" = 20 AND (provider LIKE 'ldap%') LIMIT 1
Instantiating Gitlab::Auth::Ldap::Person with LDIF:
dn: cn=John Smith,ou=people,dc=example,dc=com
cn: John Smith
mail: email@example.com
memberof: cn=admin_staff,ou=people,dc=example,dc=com
uid: John

  UserSyncedAttributesMetadata Load (0.9ms)  SELECT  "user_synced_attributes_metadata".* FROM "user_synced_attributes_metadata" WHERE "user_synced_attributes_metadata"."user_id" = 20 LIMIT 1
   (0.3ms)  BEGIN
  Namespace Load (1.0ms)  SELECT  "namespaces".* FROM "namespaces" WHERE "namespaces"."owner_id" = 20 AND "namespaces"."type" IS NULL LIMIT 1
  Route Load (0.8ms)  SELECT  "routes".* FROM "routes" WHERE "routes"."source_id" = 27 AND "routes"."source_type" = 'Namespace' LIMIT 1
  Ci::Runner Load (1.1ms)  SELECT "ci_runners".* FROM "ci_runners" INNER JOIN "ci_runner_namespaces" ON "ci_runners"."id" = "ci_runner_namespaces"."runner_id" WHERE "ci_runner_namespaces"."namespace_id" = 27
   (0.7ms)  COMMIT
   (0.4ms)  BEGIN
  Route Load (0.8ms)  SELECT "routes".* FROM "routes" WHERE (LOWER("routes"."path") = LOWER('John'))
  Namespace Load (1.0ms)  SELECT  "namespaces".* FROM "namespaces" WHERE "namespaces"."id" = 27 LIMIT 1
  Route Exists (0.9ms)  SELECT  1 AS one FROM "routes" WHERE LOWER("routes"."path") = LOWER('John') AND "routes"."id" != 50 LIMIT 1
  User Update (1.1ms)  UPDATE "users" SET "updated_at" = '2019-10-17 14:40:59.751685', "last_credential_check_at" = '2019-10-17 14:40:59.738714' WHERE "users"."id" = 20

There’s a lot here, so let’s go over what could be helpful when debugging.

First, GitLab looks for all users that have previously
signed in with LDAP and iterate on them. Each user’s sync starts with
the following line that contains the user’s username and email, as they
exist in GitLab now:

Syncing user John, email@example.com

If you don’t find a particular user’s GitLab email in the output, then that
user hasn’t signed in with LDAP yet.

Next, GitLab searches its identities table for the existing
link between this user and the configured LDAP providers:

  Identity Load (0.9ms)  SELECT  "identities".* FROM "identities" WHERE "identities"."user_id" = 20 AND (provider LIKE 'ldap%') LIMIT 1

The identity object has the DN that GitLab uses to look for the user
in LDAP. If the DN isn’t found, the email is used instead. We can see that
this user is found in LDAP:

Instantiating Gitlab::Auth::Ldap::Person with LDIF:
dn: cn=John Smith,ou=people,dc=example,dc=com
cn: John Smith
mail: email@example.com
memberof: cn=admin_staff,ou=people,dc=example,dc=com
uid: John

If the user wasn’t found in LDAP with either the DN or email, you may see the
following message instead:

LDAP search error: No Such Object

…in which case the user is blocked:

  User Update (0.4ms)  UPDATE "users" SET "state" = $1, "updated_at" = $2 WHERE "users"."id" = $3  [["state", "ldap_blocked"], ["updated_at", "2019-10-18 15:46:22.902177"], ["id", 20]]

After the user is found in LDAP, the rest of the output updates the GitLab
database with any changes.

Query a user in LDAP

This tests that GitLab can reach out to LDAP and read a particular user.
It can expose potential errors connecting to and/or querying LDAP
that may seem to fail silently in the GitLab UI.

Rails.logger.level = Logger::DEBUG

adapter = Gitlab::Auth::Ldap::Adapter.new('ldapmain') # If `main` is the LDAP provider
Gitlab::Auth::Ldap::Person.find_by_uid('<uid>', adapter)

Group memberships (PREMIUM SELF)

Memberships not granted

Sometimes you may think a particular user should be added to a GitLab group via
LDAP group sync, but for some reason it’s not happening. You can check several
things to debug the situation.

  • Ensure LDAP configuration has a group_base specified.
    This configuration is required for group sync to work properly.
  • Ensure the correct LDAP group link is added to the GitLab group.
  • Check that the user has an LDAP identity:
    1. Sign in to GitLab as an administrator user.
    2. On the top bar, select Main menu > Admin.
    3. On the left sidebar, select Overview > Users.
    4. Search for the user.
    5. Open the user by selecting their name. Do not select Edit.
    6. Select the Identities tab. There should be an LDAP identity with
      an LDAP DN as the Identifier. If not, this user hasn’t signed in with
      LDAP yet and must do so first.
  • You’ve waited an hour or the configured interval for
    the group to sync. To speed up the process, either go to the GitLab group Group information > Members
    and press Sync now (sync one group) or run the group sync Rake task
    (sync all groups).

If all of the above looks good, jump in to a little more advanced debugging in
the rails console.

  1. Enter the rails console.
  2. Choose a GitLab group to test with. This group should have an LDAP group link
    already configured.
  3. Enable debug logging, find the above GitLab group, and sync it with LDAP.
  4. Look through the output of the sync. See example log output
    for how to read the output.
  5. If you still aren’t able to see why the user isn’t being added, query the LDAP group directly
    to see what members are listed.
  6. Is the user’s DN or UID in one of the lists from the above output? One of the DNs or
    UIDs here should match the ‘Identifier’ from the LDAP identity checked earlier. If it doesn’t,
    the user does not appear to be in the LDAP group.

Administrator privileges not granted

When Administrator sync has been configured
but the configured users aren’t granted the correct administrator privileges, confirm
the following are true:

  • A group_base is also configured.
  • The configured admin_group in the gitlab.rb is a CN, rather than a DN or an array.
  • This CN falls under the scope of the configured group_base.
  • The members of the admin_group have already signed into GitLab with their LDAP
    credentials. GitLab only grants administrator access to the users whose
    accounts are already connected to LDAP.

If all the above are true and the users are still not getting access,
run a manual group sync in the rails console and
look through the output to see what happens when
GitLab syncs the admin_group.

Sync now button stuck in the UI

The Sync now button on the Group > Members page of a group can become stuck. The button becomes stuck after it is pressed and the page is reloaded. The button then
cannot be selected again.

The Sync now button can become stuck for many reasons and requires debugging for specific cases. The following are two possible causes and possible solutions to the problem.

Invalid memberships

The Sync now button becomes stuck if some of the group’s members or requesting members are invalid. You can track progress on improving the visibility of this problem in
a relevant issue. You can use a Rails console to confirm if this problem is causing the Sync now
button to be stuck:

# Find the group in question
group = Group.find_by(name: 'my_gitlab_group')

# Look for errors on the Group itself
group.valid?
group.errors.map(&:full_messages)

# Look for errors among the group's members and requesters
group.requesters.map(&:valid?)
group.requesters.map(&:errors).map(&:full_messages)
group.members.map(&:valid?)
group.members.map(&:errors).map(&:full_messages)

A displayed error can identify the problem and point to a solution. For example, the Support Team has seen the following error:

irb(main):018:0> group.members.map(&:errors).map(&:full_messages)
=> [["The member's email address is not allowed for this group. Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."]]

This error showed that an Administrator chose to restrict group membership by email domain,
but there was a typo in the domain. After the domain setting was fixed, the Sync now button functioned again.

Missing LDAP configuration on Sidekiq nodes

The Sync now button becomes stuck when GitLab is scaled over multiple nodes and the LDAP configuration is missing from
the /etc/gitlab/gitlab.rb on the nodes running Sidekiq.
In this case, the Sidekiq jobs seem to disappear.

LDAP is required on the Sidekiq nodes because LDAP has multiple jobs that are
run asynchronously that require a local LDAP configuration:

  • User sync.
  • Group sync.

You can test whether missing LDAP configuration is the problem by running the Rake task to check LDAP
on each node that is running Sidekiq. If LDAP is set up correctly on this node, it connects to the LDAP server and returns users.

To solve this issue, configure LDAP on the Sidekiq nodes.
When configured, run the Rake task to check LDAP to confirm
that the GitLab node can connect to LDAP.

Sync all groups

NOTE:
To sync all groups manually when debugging is unnecessary,
use the Rake task instead.

The output from a manual group sync can show you what happens
when GitLab syncs its LDAP group memberships against LDAP.

Rails.logger.level = Logger::DEBUG

LdapAllGroupsSyncWorker.new.perform

Next, learn how to read the output.

Example console output after a group sync

Like the output from the user sync, the output from the
manual group sync is also very verbose. However, it contains lots
of helpful information.

Indicates the point where syncing actually begins:

Started syncing 'ldapmain' provider for 'my_group' group

The following entry shows an array of all user DNs GitLab sees in the LDAP server.
These DNs are the users for a single LDAP group, not a GitLab group. If
you have multiple LDAP groups linked to this GitLab group, you see multiple
log entries like this — one for each LDAP group. If you don’t see an LDAP user
DN in this log entry, LDAP is not returning the user when we do the lookup.
Verify the user is actually in the LDAP group.

Members in 'ldap_group_1' LDAP group: ["uid=john0,ou=people,dc=example,dc=com",
"uid=mary0,ou=people,dc=example,dc=com", "uid=john1,ou=people,dc=example,dc=com",
"uid=mary1,ou=people,dc=example,dc=com", "uid=john2,ou=people,dc=example,dc=com",
"uid=mary2,ou=people,dc=example,dc=com", "uid=john3,ou=people,dc=example,dc=com",
"uid=mary3,ou=people,dc=example,dc=com", "uid=john4,ou=people,dc=example,dc=com",
"uid=mary4,ou=people,dc=example,dc=com"]

Shortly after each of the above entries, you see a hash of resolved member
access levels. This hash represents all user DNs GitLab thinks should have
access to this group, and at which access level (role). This hash is additive,
and more DNs may be added, or existing entries modified, based on additional
LDAP group lookups. The very last occurrence of this entry should indicate
exactly which users GitLab believes should be added to the group.

NOTE:
10 is Guest, 20 is Reporter, 30 is Developer, 40 is Maintainer
and 50 is Owner.

Resolved 'my_group' group member access: {"uid=john0,ou=people,dc=example,dc=com"=>30,
"uid=mary0,ou=people,dc=example,dc=com"=>30, "uid=john1,ou=people,dc=example,dc=com"=>30,
"uid=mary1,ou=people,dc=example,dc=com"=>30, "uid=john2,ou=people,dc=example,dc=com"=>30,
"uid=mary2,ou=people,dc=example,dc=com"=>30, "uid=john3,ou=people,dc=example,dc=com"=>30,
"uid=mary3,ou=people,dc=example,dc=com"=>30, "uid=john4,ou=people,dc=example,dc=com"=>30,
"uid=mary4,ou=people,dc=example,dc=com"=>30}

It’s not uncommon to see warnings like the following. These indicate that GitLab
would have added the user to a group, but the user could not be found in GitLab.
Usually this is not a cause for concern.

If you think a particular user should already exist in GitLab, but you’re seeing
this entry, it could be due to a mismatched DN stored in GitLab. See
User DN and email have changed to update the user’s LDAP identity.

User with DN `uid=john0,ou=people,dc=example,dc=com` should have access
to 'my_group' group but there is no user in GitLab with that
identity. Membership will be updated when the user signs in for
the first time.

Finally, the following entry says syncing has finished for this group:

Finished syncing all providers for 'my_group' group

When all the configured group links have been synchronized, GitLab looks
for any Administrators or External users to sync:

Syncing admin users for 'ldapmain' provider

The output looks similar to what happens with a single group, and then
this line indicates the sync is finished:

Finished syncing admin users for 'ldapmain' provider

If administrator sync is not configured, you see a message
stating as such:

No `admin_group` configured for 'ldapmain' provider. Skipping

Sync one group

Syncing all groups can produce a lot of noise in the output, which can be
distracting when you’re only interested in troubleshooting the memberships of
a single GitLab group. In that case, here’s how you can just sync this group
and see its debug output:

Rails.logger.level = Logger::DEBUG

# Find the GitLab group.
# If the output is `nil`, the group could not be found.
# If a bunch of group attributes are in the output, your group was found successfully.
group = Group.find_by(name: 'my_gitlab_group')

# Sync this group against LDAP
EE::Gitlab::Auth::Ldap::Sync::Group.execute_all_providers(group)

The output is similar to
that you get from syncing all groups.

Query a group in LDAP

When you’d like to confirm that GitLab can read a LDAP group and see all its members,
you can run the following:

# Find the adapter and the group itself
adapter = Gitlab::Auth::Ldap::Adapter.new('ldapmain') # If `main` is the LDAP provider
ldap_group = EE::Gitlab::Auth::Ldap::Group.find_by_cn('group_cn_here', adapter)

# Find the members of the LDAP group
ldap_group.member_dns
ldap_group.member_uids

LDAP synchronization does not remove group creator from group

LDAP synchronization should remove an LDAP group’s creator
from that group, if that user does not exist in the group. If running LDAP synchronization
does not do this:

  1. Add the user to the LDAP group.
  2. Wait until LDAP group synchronization has finished running.
  3. Remove the user from the LDAP group.

User DN and email have changed

If both the primary email and the DN change in LDAP, GitLab cannot identify the correct LDAP record of a user. As a
result, GitLab blocks that user. So that GitLab can find the LDAP record, update the user’s existing GitLab profile with
at least either:

  • The new primary email.
  • DN values.

The following script updates the emails for all provided users so they aren’t blocked or unable to access their accounts.

NOTE:
The following script requires that any new accounts with the new
email address are removed first. Email addresses must be unique in GitLab.

Go to the rails console and then run:

# Each entry must include the old username and the new email
emails = {
  'ORIGINAL_USERNAME' => 'NEW_EMAIL_ADDRESS',
  ...
}

emails.each do |username, email|
  user = User.find_by_username(username)
  user.email = email
  user.skip_reconfirmation!
  user.save!
end

You can then run a UserSync (PREMIUM SELF) to sync the latest DN
for each of these users.

Could not authenticate you from Ldapmain because "Unknown provider"

You can receive the following error when authenticating with an LDAP server:

Could not authenticate you from Ldapmain because "Unknown provider (ldapsecondary). available providers: ["ldapmain"]".

This error is caused when using an account that previously authenticated with an LDAP server that is renamed or removed from your GitLab configuration. For example:

  • Initially, main and secondary are set in ldap_servers in GitLab configuration.
  • The secondary setting is removed or renamed to main.
  • A user attempting to sign in has an identify record for secondary, but that is no longer configured.

Use the Rails console to list affected users and check what LDAP servers they have identities for:

ldap_identities = Identity.where(provider: "ldapsecondary")
ldap_identities.each do |identity|
  u=User.find_by_id(identity.user_id)
  ui=Identity.where(user_id: identity.user_id)
  puts "user: #{u.username}n   #{u.email}n   last activity: #{u.last_activity_on}n   #{identity.provider} ID: #{identity.id} external: #{identity.extern_uid}"
  puts "   all identities:"
  ui.each do |alli|
    puts "    - #{alli.provider} ID: #{alli.id} external: #{alli.extern_uid}"
  end
end;nil

You can solve this error in two ways.

Rename references to the LDAP server

This solution is suitable when the LDAP servers are replicas of each other, and the affected users should be able to sign in using a configured LDAP server. For example, if a
load balancer is now used to manage LDAP high availability and a separate secondary sign-in option is no longer needed.

NOTE:
If the LDAP servers aren’t replicas of each other, this solution stops affected users from being able to sign in.

To rename references to the LDAP server that is no longer configured, run:

sudo gitlab-rake gitlab:ldap:rename_provider[ldapsecondary,ldapmain]

Remove the identity records that relate to the removed LDAP server

With this solution, affected users can sign in with the configured LDAP servers and a new identity record is created by GitLab. In a
Rails console, delete the ldapsecondary identities:

ldap_identities = Identity.where(provider: "ldapsecondary")
ldap_identities.each do |identity|
  puts "Destroying identity: #{identity.id} #{identity.provider}: #{identity.extern_uid}"
  identity.destroy!
rescue => e
  puts 'Error generated when destroying identity:n ' + e.to_s
end; nil

Expired license causes errors with multiple LDAP servers

Using multiple LDAP servers requires a valid license. An expired license can
cause:

  • 502 errors in the web interface.

  • The following error in logs (the actual strategy name depends on the name configured in /etc/gitlab/gitlab.rb):

    Could not find a strategy with name `Ldapsecondary'. Please ensure it is required or explicitly set it using the :strategy_class option. (Devise::OmniAuth::StrategyNotFound)
    

To resolve this error, you must apply a new license to the GitLab instance without the web interface:

  1. Remove or comment out the GitLab configuration lines for all non-primary LDAP servers.
  2. Reconfigure GitLab so that it temporarily uses only one LDAP server.
  3. Enter the Rails console and add the license key.
  4. Re-enable the additional LDAP servers in the GitLab configuration and reconfigure GitLab again.

Debugging Tools

LDAP check

The Rake task to check LDAP is a valuable tool
to help determine whether GitLab can successfully establish a connection to
LDAP and can get so far as to even read users.

If a connection can’t be established, it is likely either because of a problem
with your configuration or a firewall blocking the connection.

  • Ensure you don’t have a firewall blocking the
    connection, and that the LDAP server is accessible to the GitLab host.
  • Look for an error message in the Rake check output, which may lead to your LDAP configuration to
    confirm that the configuration values (specifically host, port, bind_dn, and
    password) are correct.
  • Look for errors in the logs to further debug connection failures.

If GitLab can successfully connect to LDAP but doesn’t return any
users, see what to do when no users are found.

GitLab logs

If a user account is blocked or unblocked due to the LDAP configuration, a
message is logged to application_json.log.

If there is an unexpected error during an LDAP lookup (configuration error,
timeout), the sign-in is rejected and a message is logged to production.log.

ldapsearch

ldapsearch is a utility that allows you to query your LDAP server. You can
use it to test your LDAP settings and ensure that the settings you’re using
get you the results you expect.

When using ldapsearch, be sure to use the same settings you’ve already
specified in your gitlab.rb configuration so you can confirm what happens
when those exact settings are used.

Running this command on the GitLab host also helps confirm that there’s no
obstruction between the GitLab host and LDAP.

For example, consider the following GitLab configuration:

gitlab_rails['ldap_servers'] = YAML.load <<-'EOS' # remember to close this block with 'EOS' below
   main: # 'main' is the GitLab 'provider ID' of this LDAP server
     label: 'LDAP'
     host: '127.0.0.1'
     port: 389
     uid: 'uid'
     encryption: 'plain'
     bind_dn: 'cn=admin,dc=ldap-testing,dc=example,dc=com'
     password: 'Password1'
     active_directory: true
     allow_username_or_email_login: false
     block_auto_created_users: false
     base: 'dc=ldap-testing,dc=example,dc=com'
     user_filter: ''
     attributes:
       username: ['uid', 'userid', 'sAMAccountName']
       email:    ['mail', 'email', 'userPrincipalName']
       name:       'cn'
       first_name: 'givenName'
       last_name:  'sn'
     group_base: 'ou=groups,dc=ldap-testing,dc=example,dc=com'
     admin_group: 'gitlab_admin'
EOS

You would run the following ldapsearch to find the bind_dn user:

ldapsearch -D "cn=admin,dc=ldap-testing,dc=example,dc=com" 
  -w Password1 
  -p 389 
  -h 127.0.0.1 
  -b "dc=ldap-testing,dc=example,dc=com"

The bind_dn, password, port, host, and base are all
identical to what’s configured in the gitlab.rb.

Use ldapsearch with start_tls encryption

The previous example performs an LDAP test in plaintext to port 389. If you are using start_tls encryption, in
the ldapsearch command include:

  • The -Z flag.
  • The FQDN of the LDAP server.

You must include these because, during TLS negotiation, the FQDN of the LDAP server is evaluated against its certificate:

ldapsearch -D "cn=admin,dc=ldap-testing,dc=example,dc=com" 
  -w Password1 
  -p 389 
  -h "testing.ldap.com" 
  -b "dc=ldap-testing,dc=example,dc=com" -Z

Use ldapsearch with simple_tls encryption

If you are using simple_tls encryption (usually on port 636), include the following in the ldapsearch command:

  • The LDAP server FQDN with the -H flag and the port.
  • The full constructed URI.
ldapsearch -D "cn=admin,dc=ldap-testing,dc=example,dc=com" 
  -w Password1 
  -H "ldaps://testing.ldap.com:636" 
  -b "dc=ldap-testing,dc=example,dc=com"

For more information, see the official ldapsearch documentation.

Using AdFind (Windows)

You can use the AdFind utility (on Windows based systems) to test that your LDAP server is accessible and authentication is working correctly. AdFind is a freeware utility built by Joe Richards.

Return all objects

You can use the filter objectclass=* to return all directory objects.

adfind -h ad.example.org:636 -ssl -u "CN=GitLabSRV,CN=Users,DC=GitLab,DC=org" -up Password1 -b "OU=GitLab INT,DC=GitLab,DC=org" -f (objectClass=*)

Return single object using filter

You can also retrieve a single object by specifying the object name or full DN. In this example we specify the object name only CN=Leroy Fox.

adfind -h ad.example.org:636 -ssl -u "CN=GitLabSRV,CN=Users,DC=GitLab,DC=org" -up Password1 -b "OU=GitLab INT,DC=GitLab,DC=org" -f "(&(objectcategory=person)(CN=Leroy Fox))"

Rails console

WARNING:
It is very easy to create, read, modify, and destroy data with the rails
console. Be sure to run commands exactly as listed.

The rails console is a valuable tool to help debug LDAP problems. It allows you to
directly interact with the application by running commands and seeing how GitLab
responds to them.

For instructions about how to use the rails console, refer to this
guide.

Enable debug output

This provides debug output that shows what GitLab is doing and with what.
This value is not persisted, and is only enabled for this session in the Rails console.

To enable debug output in the rails console, enter the rails console and run:

Rails.logger.level = Logger::DEBUG

Get all error messages associated with groups, subgroups, members, and requesters

Collect error messages associated with groups, subgroups, members, and requesters. This
captures error messages that may not appear in the Web interface. This can be especially helpful
for troubleshooting issues with LDAP group sync
and unexpected behavior with users and their membership in groups and subgroups.

# Find the group and subgroup
group = Group.find_by_full_path("parent_group")
subgroup = Group.find_by_full_path("parent_group/child_group")

# Group and subgroup errors
group.valid?
group.errors.map(&:full_messages)

subgroup.valid?
subgroup.errors.map(&:full_messages)

# Group and subgroup errors for the members AND requesters
group.requesters.map(&:valid?)
group.requesters.map(&:errors).map(&:full_messages)
group.members.map(&:valid?)
group.members.map(&:errors).map(&:full_messages)
group.members_and_requesters.map(&:errors).map(&:full_messages)

subgroup.requesters.map(&:valid?)
subgroup.requesters.map(&:errors).map(&:full_messages)
subgroup.members.map(&:valid?)
subgroup.members.map(&:errors).map(&:full_messages)
subgroup.members_and_requesters.map(&:errors).map(&:full_messages)

Модератор: Модераторы разделов

CAEman

Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

ping domain
не проходит, но проходят:
ping server.domain
ping server

Команда «net ads info» выдаёт следующее:
LDAP server: ххх.ххх.х.ххх
LDAP server name: server.domain
Realm: DOMAIN
Bind Path: dc=DOMAIN
LDAP port: 389
Server time: Sat, 03 Oct 2009 13:24:57 MSD
KDC server: ххх.ххх.х.ххх
Server time offset: -10

Далее:
~ # service winbind start
Starting Samba WINBIND daemon done
~ # service winbind status
Checking for Samba WINBIND daemon dead

CAEman

Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение

CAEman » 03.10.2009 14:15

1. Отключил SuseFirevall
2. Прописал в /etc/hosts строку:
«192.168.1.1 server.domain domain domain» — естественно, для моего домена
3. ZeroConf всегда выключаю изначально…
4. В /etc/nsswitch.conf строку «hosts: files mdns4_minimal [NOTFOUND=return] dns wins» сократил до «hosts: files dns»

Результат — см. предыдущее сообщение…

Отредактировал smb.conf согласно Вашим рекомендациям.

Результат — см. предыдущее сообщение…

CAEman

Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение

CAEman » 03.10.2009 14:59

Некоторая дополнительная информация.

/etc/pam.d/common-auth :
auth required pam_env.so
auth sufficient pam_unix2.so
auth sufficient pam_krb5.so use_first_pass
auth required pam_deny.so

messages:
winbindd[17594]: [2009/10/03 14:55:38, 0] param/loadparm.c:service_ok(6492)
winbindd[17594]: WARNING: No path in service profiles — making it unavailable!
winbindd[17594]: [2009/10/03 14:55:38, 0] param/loadparm.c:service_ok(6492)
winbindd[17594]: WARNING: No path in service users — making it unavailable!
winbindd[17594]: [2009/10/03 14:55:38, 0] param/loadparm.c:service_ok(6492)
winbindd[17594]: WARNING: No path in service groups — making it unavailable!
winbindd[17594]: [2009/10/03 14:55:38, 0] param/loadparm.c:service_ok(6479)
winbindd[17594]: WARNING: [printers] service MUST be printable!
winbindd[17594]: [2009/10/03 14:55:38, 0] param/loadparm.c:service_ok(6492)
winbindd[17594]: WARNING: No path in service printers — making it unavailable!
winbindd[17594]: [2009/10/03 14:55:38, 0] param/loadparm.c:service_ok(6492)
winbindd[17594]: WARNING: No path in service print$ — making it unavailable!
winbindd[17625]: [2009/10/03 14:55:38, 0] winbindd/winbindd_cache.c:initialize_winbindd_cache(2379)
winbindd[17625]: initialize_winbindd_cache: clearing cache and re-creating with version number 1
winbindd[17625]: [2009/10/03 14:55:38, 0] winbindd/winbindd_util.c:init_domain_list(740)
winbindd[17625]: Could not fetch our SID — did we join?
winbindd[17625]: [2009/10/03 14:55:38, 0] winbindd/winbindd.c:main(1285)
winbindd[17625]: unable to initialize domain list

UTiM

Сообщения: 180
ОС: OpenSuse

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение

UTiM » 04.10.2009 21:09

CAEman писал(а): ↑

03.10.2009 12:36

Спасибо, сейчас попробую сделать проверку.
Только я не совсем понял, почему LDAP, если настроен Kerberos (по крайней мере, по нему получается билет пользователя, а вот с LDAP там что-то у меня «не доруливается»)?

И у меня несколько вопросов по smb.conf:

1) idmap gid = 10000-20000
idmap uid = 10000-20000
А почему нельзя начинать, например, с 1000 (если кроме root’a локальных не будет)?

2) auth methods = winbind
Почему эта строка не нужна?
Вернее, как определяется, что при регистрации пользователей в графическом окне DM должна проходить проверка имени и пароля на вин.сервере?

3) Если нужно, чтобы после первой авторизации создавалась домашняя папка /home/имя_пользователя (профиль пользователя), которая бы в дальнейшем уже использовалась пользователем по умолчанию, а в папки Documents и Y:, находящихся в домашней директории, каждый раз монтировались папки сервера, соответственно, usersимя_пользователя (которая на вин.машинах монтируется как диск Z:) и y (в которых нет или, по крайней мере, не видно из-под пользователя никаких .msprofile и .9xprofile), то что нужно добавить в smbfstab и прописать вместо:
template homedir = /home/%D/%U
logon path = \%Lprofiles.msprofile
logon home = \%L%U.9xprofile
logon drive = P:
и для этого нужен сервис smbfs и не нужен — smb?

Уточните, пожалуйста.

По порядку:
Керберос в данном случае не участвует в авторизации пользователя, а играет вспомогательную роль — в основном повышает комфорт работы с шарами (иначе при каждой, в т.ч. повторной, попытке доступа на сервер будете вводить логин/пароль снова) А вот для работы авторизации нужен winbind с доступом к LDAP AD

1. Почему idmap gid = 10000-20000 ? — чтоб не пересекаться с локальными пользователями. Можно-ли и другой диапазон — да, а зачем?
2. auth methods = winbind — метод авторизации при доступе к шарам на вашей машине, нужен для smbd. Но наша задача не контент по сети раздавать… вообще вот полезный сайт
3. Данные настройки определяют местонахождение домашней папки пользователя, а также профиля и проч служебных шар (для клиентов!) в случае если ваш комп с самбой является контроллером домена….
В вашем случае полезно только «template homedir = /home/%D/%U» , только наличие его необходимо, но недостаточно.
Для создания домашней папки при первом входе юзера нужен pam_mkhomedir.so прописанный в PAM
И диск сетевой у вас сам не подключится, здесь нужен настроенный pam_mount.so

А вообще читайте полезный сайт

UTiM

Сообщения: 180
ОС: OpenSuse

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение

UTiM » 04.10.2009 22:47

CAEman писал(а): ↑

03.10.2009 13:33

ping domain
не проходит, но проходят:
ping server.domain
ping server

Команда «net ads info» выдаёт следующее:
LDAP server: ххх.ххх.х.ххх
LDAP server name: server.domain
Realm: DOMAIN
Bind Path: dc=DOMAIN
LDAP port: 389
Server time: Sat, 03 Oct 2009 13:24:57 MSD
KDC server: ххх.ххх.х.ххх
Server time offset: -10

Далее:
~ # service winbind start
Starting Samba WINBIND daemon done
~ # service winbind status
Checking for Samba WINBIND daemon dead

Сервер AD доступен, winbind запускается… но мрет….
Судя по всему

— из-за отсутствия записи о компе в домене (net ads join …. мы-ж не делали…)
Попробуйте обмануть — назначить имя компу с линукс такое-же какое было у винды (запись о компе в домене с этим именем уже есть!) и прописать его в настройках сети или попробовать включить «Изменение имени узла через DHCP» … может прокатит. В противном случае — без знания пароля админа (или доступа к его телу) — ничего не выйдет… к сожалению…

Да, и

в pam быть не должно. Авторизация керберос должна быть правильно настроена, но ВЫКЛЮЧЕНА!!! (эти настройки нужны керберос-клиенту — но не для авторизации!), а вот

должно, но при условии — что winbind работает….

CAEman

Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение

CAEman » 08.10.2009 14:26

UTiM писал(а): ↑

04.10.2009 22:47

Попробуйте обмануть — назначить имя компу с линукс такое-же какое было у винды (запись о компе в домене с этим именем уже есть!) и прописать его в настройках сети или попробовать включить «Изменение имени узла через DHCP» … может прокатит. В противном случае — без знания пароля админа (или доступа к его телу) — ничего не выйдет… к сожалению…

Имя я, естественно, дал такое же. «Изменение имени узла через DHCP» включено было, но в messages выдавался соответствующий warning об отсутствии раздачи…

CAEman

Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение

CAEman » 08.10.2009 17:13

Если с winbind не получается, то можно найти какое-либо другое ПО под Линукс (желательно открытое), обеспечивающее после установки (без пароля администратора сервера) при вводе в регистрационном окне графического DM имени и пароля пользователя в случае отсутствия такого зарегистрированного локального пользователя сверку введённых имени и пароля с находящимся на win сервере списком и в случае их наличия и соответсвия создание такого же (имя и пароль) локального пользователя с настройками по умолчанию для вновь создаваемых и его загрузку? Причём доступ к списку получать, например, при помощи Кербероса.

CAEman

Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение

CAEman » 09.10.2009 12:09

UTiM писал(а): ↑

08.10.2009 19:48

Получается «анонимно» LDAP AD даже не прочитать — если нет в учетки (с правами чтения) на пользователя или хотя-бы машину.
Попробуйте созать отдельную тему с учетом всего вышеизложенного….

Нет, как раз использовать для этого введённого пользователя. По Керберосу же можно получать «билет» простому пользователю, т.е. его прав оказывается достаточно, чтобы прочесть список пользователей AD.

CAEman

Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение

CAEman » 09.10.2009 17:04

UTiM писал(а): ↑

03.10.2009 00:55

#умолчательные настройки samba (печать, права и п.р.) — не обязательно для авторизации, но не мешает — можно оставить
usershare allow guests = No
printing = cups
printcap name = cups
printcap cache time = 750
cups options = raw
map to guest = Bad User
include = /etc/samba/dhcp.conf
logon path = \%Lprofiles.msprofile
logon home = \%L%U.9xprofile
logon drive = P:

А эти параметры, касающиеся печати, как-либо влияют на настройку печати с Линукс-машины (т.е. текущей) на удалённый принтер, расшарашенный на Виндоус-машине?

CAEman

Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение

CAEman » 09.10.2009 18:53

Отредактировал следующим образом:

common-account-pc —
#account requisite pam_unix2.so
#account required pam_krb5.so use_first_pass ignore_unknown_principals
account sufficient pam_winbind.so
account required pam_unix.so nullok_secure

common-auth-pc —
#auth required pam_env.so
#auth sufficient pam_unix2.so
auth sufficient pam_winbind.so use_first_pass
#auth required pam_deny.so
auth required pam_unix.so nullok_secure

common-password-pc —
#password requisite pam_pwcheck.so nullok cracklib
#password [default=ignore success=1] pam_succeed_if.so uid > 999 quiet
#password sufficient pam_unix2.so use_authtok nullok
#password sufficient pam_krb5.so
#password required pam_deny.so
password required pam_unix.so nullok
password sufficient pam_wibind.so

common-session-pc —
#session required pam_limits.so
#session required pam_unix2.so
#session optional pam_krb5.so
#session optional pam_umask.so
session required pam_unix.so
session required pam_mkhomedir.so skel=/etc/skel/ umask=0022

nsswitch.conf —
passwd: files winbind
shadow: files winbind
group: files winbind

hosts: files dns
networks: files dns

services: files
protocols: files
rpc: files
ethers: files
netmasks: files
netgroup: files
publickey: files

bootparams: files
automount: files winbind
aliases: files
shadow: compat

smb.conf —
[global]
# log file = /var/log/samba/log.%m
# max log size = 2048
workgroup = DOMAIN
password server = server.domain
encrypt passwords = yes
# auth methods = winbind
winbind enum groups = yes
winbind enum users = yes
winbind use default domain = yes
template homedir = /home/%U
template shell = /bin/bash
winbind refresh tickets = yes
case sensitive = no
# interfaces = eth0
include = /etc/samba/dhcp.conf
idmap gid = 1000-20000
idmap uid = 1000-20000
realm = DOMAIN
security = SERVER
# dos charset = 866
# unix charset = UTF-8
usershare allow guests = No
# netbios name = %h
# logon path = \%Lprofiles.msprofile
# logon home = \%L%U.9xprofile
# logon drive = P:
# map to guest = Bad User
printing = cups
printcap name = cups
printcap cache time = 750
cups options = raw

С консоли получил:

~ # service winbind restart
Shutting down Samba WINBIND daemon done
Starting Samba WINBIND daemon done
~ # service winbind status
Checking for Samba WINBIND daemon running
~ # wbinfo -p
Ping to winbindd succeeded
~ # wbinfo -t
checking the trust secret via RPC calls failed
error code was NT_STATUS_INVALID_HANDLE (0xc0000008)
Could not check secret
~ # wbinfo -u
~ # wbinfo -g
~ #

Авторизация, естественно, не проходит…

А после перезагрузки комп-а в boot.log:


failedSetting up service (localfs) network . . . . . . . . . .failed

Starting Samba WINBIND daemon done

unknown or invalid address [server1]

unknown or invalid address [server1]

Setting up (remotefs) network interfaces:
Setting up service (remotefs) network . . . . . . . . . .done

unknown or invalid address [server1]


unknown or invalid address [server1]

Master Resource Control: runlevel 5 has been reached
Failed services in runlevel 5: ibm-prtm network
<notice>killproc: kill(2114,3)
unknown or invalid address [server1]

Что тут ещё можно сделать?

UTiM

Сообщения: 180
ОС: OpenSuse

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение

UTiM » 09.10.2009 23:10

CAEman писал(а): ↑

09.10.2009 17:04

UTiM писал(а): ↑

03.10.2009 00:55

#умолчательные настройки samba (печать, права и п.р.) — не обязательно для авторизации, но не мешает — можно оставить
…………………………..
printing = cups
printcap name = cups
printcap cache time = 750
cups options = raw
……………………………….

А эти параметры, касающиеся печати, как-либо влияют на настройку печати с Линукс-машины (т.е. текущей) на удалённый принтер, расшарашенный на Виндоус-машине?

Скорее всего это касается cups — сервера — системы печати под линух…. Дело в том, что принтеры на линуксовой машине, подлюченные к cups можно расшарить для виндовых машин с помощью самбы. Эти настройки это и помогают сделать. Обратная задача (с виндовой машины на cups) возможно требует наличия самба-клиента, но к smb.conf скорее всего никакого отношения не имеют…. Вот например ссылочка

UTiM

Сообщения: 180
ОС: OpenSuse

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение

UTiM » 09.10.2009 23:54

CAEman писал(а): ↑

09.10.2009 18:53

Что тут ещё можно сделать?

Так wbinfo -u список пользователей выдает?
А wbinfo -a пользователь_домена%пароль авторизует?

на счет

Код: Выделить всё

 wbinfo -t
checking the trust secret via RPC calls failed
error code was NT_STATUS_INVALID_HANDLE (0xc0000008)
Could not check secret

— «погуглите» сами — то-ли найти сервер не может, то-ли доступа к нему нет…

Добавлять что либо в pam при неработоспособном winbind — чревато, но в итоге должно быть примерно так:

Код: Выделить всё

common-account-pc -
account    requisite    pam_unix2.so
account    sufficient    pam_localuser.so
account    required    pam_winbind.so    use_first_pass

common-auth-pc -
auth    required    pam_env.so
auth    sufficient    pam_unix2.so
auth    required    pam_winbind.so    use_first_pass

common-password-pc -
password    sufficient    pam_winbind.so
password    requisite    pam_pwcheck.so    nullok cracklib
password    required    pam_unix2.so    nullok use_authtok

common-session-pc -
session    required    pam_mkhomedir.so
session    required    pam_limits.so
session    required    pam_unix2.so
session    required    pam_winbind.so
session    optional    pam_umask.so

Это рабочая конфигурация от OpenSUSE 10.2, в более свежих может слегка отличаться (просто сейчас нет под рукой…)

CAEman

Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение

CAEman » 16.10.2009 11:15

UTiM писал(а): ↑

09.10.2009 23:10

…. Дело в том, что принтеры на линуксовой машине, подлюченные к cups можно расшарить для виндовых машин с помощью самбы. Эти настройки это и помогают сделать. Обратная задача (с виндовой машины на cups) …

Вы, наверное, имели ввиду: «Обратная задача (с лин. машины на расшарашенный принтер на вин. машине)». Или я не совсем понял, что Вы имели здесь ввиду?

CAEman

Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение

CAEman » 16.10.2009 12:41

UTiM писал(а): ↑

09.10.2009 23:54

Так wbinfo -u список пользователей выдает?
А wbinfo -a пользователь_домена%пароль авторизует?

Я же привёл вывод консоли:
«
~ # wbinfo -u
~ # wbinfo -g
~ #
«
Я не совсем понял, что Вы имели ввиду. Может, он выдавать должен куда-то в другое место?
И, естественно, не авторизует, а выдаёт:
«challenge/response password authentication failed
error code was NT_STATUS_INVALID_HANDLE (0xc0000008)
error messsage was: Invalid handle»

CAEman

Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение

CAEman » 16.10.2009 12:51

UTiM писал(а): ↑

09.10.2009 23:54

Добавлять что либо в pam при неработоспособном winbind — чревато, но в итоге должно быть примерно так:

Код: Выделить всё

common-account-pc -
account    requisite    pam_unix2.so
account    sufficient    pam_localuser.so
account    required    pam_winbind.so    use_first_pass

common-auth-pc -
auth    required    pam_env.so
auth    sufficient    pam_unix2.so
auth    required    pam_winbind.so    use_first_pass

common-password-pc -
password    sufficient    pam_winbind.so
password    requisite    pam_pwcheck.so    nullok cracklib
password    required    pam_unix2.so    nullok use_authtok

common-session-pc -
session    required    pam_mkhomedir.so
session    required    pam_limits.so
session    required    pam_unix2.so
session    required    pam_winbind.so
session    optional    pam_umask.so

Это рабочая конфигурация от OpenSUSE 10.2, в более свежих может слегка отличаться (просто сейчас нет под рукой…)

Переправил всё как здесь.
Результат тот же:
«
~ # service winbind restart
Shutting down Samba WINBIND daemon done
Starting Samba WINBIND daemon done
~ # service winbind status
Checking for Samba WINBIND daemon running
~ # wbinfo -u
«
А при security=ADS вместо SERVER выдаёт вместо «running» — «dead», а в конце (т.е. после wbinfo -u) добавляет: «Error looking up domain users»

UTiM

Сообщения: 180
ОС: OpenSuse

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение

UTiM » 16.10.2009 23:12

CAEman писал(а): ↑

16.10.2009 11:15

UTiM писал(а): ↑

09.10.2009 23:10

…. Дело в том, что принтеры на линуксовой машине, подлюченные к cups можно расшарить для виндовых машин с помощью самбы. Эти настройки это и помогают сделать. Обратная задача (с виндовой машины на cups) …

Вы, наверное, имели ввиду: «Обратная задача (с лин. машины на расшарашенный принтер на вин. машине)». Или я не совсем понял, что Вы имели здесь ввиду?

Все правильно. Только вы имеете в виду: «печатать с лин. на сетевой принтер под вин.», а я «подключить к лин. машине сетевой принтер под вин.» ( для печати, естественно). Это то-же самое.

UTiM

Сообщения: 180
ОС: OpenSuse

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение

UTiM » 16.10.2009 23:35

CAEman писал(а): ↑

16.10.2009 12:51

А при security=ADS вместо SERVER выдаёт вместо «running» — «dead», а в конце (т.е. после wbinfo -u) добавляет: «Error looking up domain users»

Должно быть «security=ADS» — тогда самба работает как член виндового домена (во всяком случае с точки зрения авторизации пользователей на своих шарах), обязательно-ли это для простой авторизации пользователей — скорее всего да (на http://smb-conf.ru/security-g.html не очень понятно) — но то что у вас не работает иначе — показатель!

«wbinfo -u» при нормально функционирующем winbind выдает список доменных пользователей.
Без работающего winbinda дальнейшие игры с настройками pam — бесмысленны. А без ввода компа в домен (или хотя-бы ручной правки учетки в AD) — что может сделать только админ — попытки бесполезны.

Можете для интереса покрутить авторизацию keberos, хотя я еще ни разу не слышал о ее применении для авторизации в виндовом домене, возможно потому — что имеется в виду некий «стандартный» керберос (так-же как «стандартный» LDAP при LDAP авторизации), а не то, что Микрософт имеет в виду…. Копайте в сети — может обрящите….

CAEman

Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение

CAEman » 23.10.2009 13:07

UTiM писал(а): ↑

16.10.2009 23:35

[Можете для интереса покрутить авторизацию keberos, хотя я еще ни разу не слышал о ее применении для авторизации в виндовом домене, возможно потому — что имеется в виду некий «стандартный» керберос (так-же как «стандартный» LDAP при LDAP авторизации), а не то, что Микрософт имеет в виду…. Копайте в сети — может обрящите….

А Вы не сможете мне объяснить теоретически суть проблемы?
Ведь мы имеем:
1) Керберос, который выдаёт «билет», и монтирование mount.cifs (правда, несмотря на полученный «билет», — только с опцией user, что, насколько я понимаю, свидетельствует об аутентификации только по ntlm) без всяких админ-ских серверных паролей.
2) Регистратор Линукса (если я не ошибаюсь, то он называется PAM), который позволяет создавать и загружаться пользователям на основе списка на AD сервере.
Для последнего требуется считать список пользователей с сервера, что везде предлагается делать почему-то при помощи samba (winbind), который без регистрации комп-а в домене не работает. Если весь механизм локального создания и загрузки пользователя заключён НЕ в winbind’е, то почему все используют только его (насколько я понимаю, обеспечивающего в данной задаче только считывание списка пользоватей на сервере), а, например, не приведённые в п.1 сервисы? Невозможно настроить pam для регистрации с помощью AD списка, так как в нём где-то забито использование для этого winbind’а? Или в чём конкретно заключается проблема? Кто знает?

CAEman

Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение

CAEman » 26.02.2010 13:51

UTiM писал(а): ↑

16.10.2009 23:35

CAEman писал(а): ↑

16.10.2009 12:51

А при security=ADS вместо SERVER выдаёт вместо «running» — «dead», а в конце (т.е. после wbinfo -u) добавляет: «Error looking up domain users»

Должно быть «security=ADS» — тогда самба работает как член виндового домена (во всяком случае с точки зрения авторизации пользователей на своих шарах), обязательно-ли это для простой авторизации пользователей — скорее всего да (на http://smb-conf.ru/security-g.html не очень понятно) — но то что у вас не работает иначе — показатель!

«wbinfo -u» при нормально функционирующем winbind выдает список доменных пользователей.
Без работающего winbinda дальнейшие игры с настройками pam — бесмысленны. А без ввода компа в домен (или хотя-бы ручной правки учетки в AD) — что может сделать только админ — попытки бесполезны.

Можете для интереса покрутить авторизацию keberos, хотя я еще ни разу не слышал о ее применении для авторизации в виндовом домене, возможно потому — что имеется в виду некий «стандартный» керберос (так-же как «стандартный» LDAP при LDAP авторизации), а не то, что Микрософт имеет в виду…. Копайте в сети — может обрящите….

Решил сделать LDAP авторизацию с kerberos аутентификацией.
LDAP работает, например, в следующем виде:

Код: Выделить всё

~ # ldapsearch -v -x -D CN=user,CN=Users,DC=domain -W -LLL "(cn=*)

с выводом всех пользователей (вернее с, естественно, «Size limit exceeded (4)» в конце).
Т.е. простой пользователь с помощью ldap имеет доступ к спискам пользователей AD. Можно это будет как-нибудь использовать для авторизации на сервере с применением введённых имени и пароля и без предварительного создания локального пользователя?

Попробовал «$ ssh user@localhost» . В результате вновь и вновь выдаётся строка с требованием ввода пароля (пока не прервёшь), а в /var/log/messages записывается следующая информация:

Код: Выделить всё

sshd[7005]: nss_ldap: could not search LDAP server - Server is unavailable
sshd[7005]: Invalid user user from 127.0.0.1
sshd[7010]: pam_krb5[7010]: default/local realm 'DOMAIN'
sshd[7010]: pam_krb5[7010]: configured realm 'DOMAIN'
sshd[7010]: pam_krb5[7010]: flag: debug
sshd[7010]: pam_krb5[7010]: flags: forwardable not proxiable
sshd[7010]: pam_krb5[7010]: flag: no ignore_afs
sshd[7010]: pam_krb5[7010]: flag: no null_afs
sshd[7010]: pam_krb5[7010]: flag: user_check
sshd[7010]: pam_krb5[7010]: flag: no krb4_convert
sshd[7010]: pam_krb5[7010]: flag: krb4_convert_524
sshd[7010]: pam_krb5[7010]: flag: krb4_use_as_req
sshd[7010]: pam_krb5[7010]: will try previously set password first
sshd[7010]: pam_krb5[7010]: will let libkrb5 ask questions
sshd[7010]: pam_krb5[7010]: flag: use_shmem
sshd[7010]: pam_krb5[7010]: flag: external
sshd[7010]: pam_krb5[7010]: flag: warn
sshd[7010]: pam_krb5[7010]: ticket lifetime: 43200s (0d,12h,0m,0s)
sshd[7010]: pam_krb5[7010]: renewable lifetime: 86400s (1d,0h,0m,0s)
sshd[7010]: pam_krb5[7010]: minimum uid: 1
sshd[7010]: pam_krb5[7010]: banner: Kerberos 5
sshd[7010]: pam_krb5[7010]: ccache dir: /tmp
sshd[7010]: pam_krb5[7010]: ccname template: FILE:%d/krb5cc_%U_XXXXXX
sshd[7010]: pam_krb5[7010]: keytab: FILE:/etc/krb5.keytab
sshd[7010]: pam_krb5[7010]: token strategy: v4,524,2b,rxk5
sshd[7010]: pam_krb5[7010]: pam_authenticate called for 'user', realm 'DOMAIN'
sshd[7010]: nss_ldap: could not search LDAP server - Server is unavailable
sshd[7010]: pam_krb5[7010]: error resolving user name 'user' to uid/gid pair
sshd[7010]: pam_krb5[7010]: error getting information about 'user'
sshd[7010]: nss_ldap: could not search LDAP server - Server is unavailable

А после ввода пароля добавляется:

Код: Выделить всё

sshd[7142]: error: PAM: Authentication failure for illegal user user from localhost
sshd[7142]: Failed keyboard-interactive/pam for invalid user user from 127.0.0.1 port 45307 ssh2
sshd[7148]: pam_krb5[7148]: default/local realm 'DOMAIN'
sshd[7148]: pam_krb5[7148]: configured realm 'DOMAIN'
sshd[7148]: pam_krb5[7148]: flag: debug
sshd[7148]: pam_krb5[7148]: flags: forwardable not proxiable
sshd[7148]: pam_krb5[7148]: flag: no ignore_afs
sshd[7148]: pam_krb5[7148]: flag: no null_afs
sshd[7148]: pam_krb5[7148]: flag: user_check
sshd[7148]: pam_krb5[7148]: flag: no krb4_convert
sshd[7148]: pam_krb5[7148]: flag: krb4_convert_524
sshd[7148]: pam_krb5[7148]: flag: krb4_use_as_req
sshd[7148]: pam_krb5[7148]: will try previously set password first
sshd[7148]: pam_krb5[7148]: will let libkrb5 ask questions
sshd[7148]: pam_krb5[7148]: flag: use_shmem
sshd[7148]: pam_krb5[7148]: flag: external
sshd[7148]: pam_krb5[7148]: flag: warn
sshd[7148]: pam_krb5[7148]: ticket lifetime: 43200s (0d,12h,0m,0s)
sshd[7148]: pam_krb5[7148]: renewable lifetime: 86400s (1d,0h,0m,0s)
sshd[7148]: pam_krb5[7148]: minimum uid: 1
sshd[7148]: pam_krb5[7148]: banner: Kerberos 5
sshd[7148]: pam_krb5[7148]: ccache dir: /tmp
sshd[7148]: pam_krb5[7148]: ccname template: FILE:%d/krb5cc_%U_XXXXXX
sshd[7148]: pam_krb5[7148]: keytab: FILE:/etc/krb5.keytab
sshd[7148]: pam_krb5[7148]: token strategy: v4,524,2b,rxk5
sshd[7148]: pam_krb5[7148]: pam_authenticate called for 'user', realm 'DOMAIN'
sshd[7148]: nss_ldap: could not search LDAP server - Server is unavailable
sshd[7148]: pam_krb5[7148]: error resolving user name 'user' to uid/gid pair
sshd[7148]: pam_krb5[7148]: error getting information about 'user'
sshd[7148]: nss_ldap: could not search LDAP server - Server is unavailable

Почему ldapsearch обнаруживает сервер, a nss_ldap — нет? Может, А) в какой-нибудь конфигурации следует как-то прописать правильный синтаксис запроса (CN=user,CN=Users,DN=domain), или Б) для него обязателен ввод машины в домен?
Если бы сервер был обнаружен, то локальный пользователь, одноимённый серверному, должен был бы создаться?
В случае Б скрипт помочь не сможет?

UTiM

Сообщения: 180
ОС: OpenSuse

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение

UTiM » 26.02.2010 18:18

CAEman писал(а): ↑

26.02.2010 13:51

LDAP работает, например, в следующем виде:

Код: Выделить всё

~ # ldapsearch -v -x -D CN=user,CN=Users,DC=domain -W -LLL "(cn=*)

с выводом всех пользователей (вернее с, естественно, «Size limit exceeded (4)» в конце).
Т.е. простой пользователь с помощью ldap имеет доступ к спискам пользователей AD. Можно это будет как-нибудь использовать для авторизации на сервере с применением введённых имени и пароля и без предварительного создания локального пользователя?

До домена через ldapsearch вы достучитесь (сам юзаю), но не авторизуетесь! Выше уже было сказано почему. LDAP от микросовта (без напильника — а напильник только у админа) не содержит нужных для pam-ldap авторизации полей. Вообще, если вы не админ, то просто заведите себе локальную учетку со своим логином и паролем (как в домене), в настройки доступа «Центр управления»-«Сеть и интернет»-«Обзор локальной сети» вбейте (с доменным суфиксом) логин — пароль и ходите по доменным шарам долго и щастливо…. Или уже купите админу пиво, что-б он вам в «net ads join….» один раз пароль ввел….. :drunk:

CAEman

Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение

CAEman » 26.02.2010 21:35

UTiM писал(а): ↑

26.02.2010 18:18

До домена через ldapsearch вы достучитесь (сам юзаю), но не авторизуетесь! Выше уже было сказано почему. LDAP от микросовта (без напильника — а напильник только у админа) не содержит нужных для pam-ldap авторизации полей. Вообще, если вы не админ, то просто заведите себе локальную учетку со своим логином и паролем (как в домене), в настройки доступа «Центр управления»-«Сеть и интернет»-«Обзор локальной сети» вбейте (с доменным суфиксом) логин — пароль и ходите по доменным шарам долго и щастливо…. Или уже купите админу пиво, что-б он вам в «net ads join….» один раз пароль ввел….. :drunk:

Я и так могу шарить по домену «долго и щастливо….». Но комп-ов — с десяток, а пользователей — тысячи, а админ. — о-о-очень далеко…
Неужели нельзя сделать скрипт, использующий введённые имя и пароль с помощью ldapsearch для доступа к спискам пользователей на сервере, а аутентификацию уже проводить с помощью kerberos (или даже обойтись без неё — получил доступ к спискам пользователей на сервере, — значит, авторизовался)?

UTiM

Сообщения: 180
ОС: OpenSuse

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение

UTiM » 26.02.2010 23:26

CAEman писал(а): ↑

26.02.2010 21:35

Неужели нельзя сделать скрипт, использующий введённые имя и пароль с помощью ldapsearch для доступа к спискам пользователей на сервере, а аутентификацию уже проводить с помощью kerberos (или даже обойтись без неё — получил доступ к спискам пользователей на сервере, — значит, авторизовался)?

Получить список пользователей ldap — не значит авторизоваться… а вот получить билет kerberos — уже почти.. А вообще — теоретически данная схема может быть работоспособна. Правда возможно для этого надо минимум собственный pam- модуль написать… (авторизация с помощью pam_krb5 я так понял — непрокатила?) На этом мои знания, к сожалению, заканчиваются…. Если вам больше никто не поможет — значит просто вы — первый будете!

P.S.
А, да — совет — создайте все-таки отдельную тему, типа «авторизация в виндовом домене без знания пароля админа» — больше вероятность, что знающие люди увидят и ответят, так как с данным топиком ваш вопрос мало коррелирует…

CAEman

Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение

CAEman » 05.03.2010 18:03

UTiM писал(а): ↑

26.02.2010 23:26

… (авторизация с помощью pam_krb5 я так понял — непрокатила?) …

А разве pam_krb5 производит полную авторизацию, а не только аутентификацию?
А как kerberos для этого следует настроить?

Насчёт темы. Одну я уже пытался здесь открыть (http://unixforum.org/index.php?showtopic=103937).
Там мне посоветовали список логинов из домена выдернуть ldapsearch-ем и после этого завести их всех в /etc/passwd. Как я понял, в ручном режиме.
Но дело в том, что список непостоянный. Можно же это как-нибудь автоматизировать (например, с помощью /etc/init.d/boot.local), но чтобы пароль был закодирован (раз уж это нельзя сделать с помощью скрипта при авторизации, а нужно писать модуль…)?
Ну, а новую тему в каком разделе Вы мне посоветуете открыть?

UTiM

Сообщения: 180
ОС: OpenSuse

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение

UTiM » 05.03.2010 19:32

CAEman писал(а): ↑

05.03.2010 18:03

А разве pam_krb5 производит полную авторизацию, а не только аутентификацию?
А как kerberos для этого следует настроить?

Ну если это полноценный «auth» pam-модуль — и результатом его выполнения может быть «required» или «sufficient» , то может. Для этого рекомендую почитать про технологию pam, например вот здесь коротенько. Затем обратиться к «первоисточнику» — к докам от авторов pam_krb5 — там, по идее, будет написано что он может и как настроить krb5.conf. (будет-ли все это работать — только тесты покажут…) Я знаю только про настройку для нужд самбы…

CAEman писал(а): ↑

05.03.2010 18:03

Насчёт темы. Одну я уже пытался здесь открыть (http://unixforum.org/index.php?showtopic=103937).
Там мне посоветовали список логинов из домена выдернуть ldapsearch-ем и после этого завести их всех в /etc/passwd. Как я понял, в ручном режиме.
Но дело в том, что список непостоянный. Можно же это как-нибудь автоматизировать (например, с помощью /etc/init.d/boot.local), но чтобы пароль был закодирован (раз уж это нельзя сделать с помощью скрипта при авторизации, а нужно писать модуль…)?

Список логинов выдернуть и запихнуть в /etc/passwd скриптом можно, но что делать с паролями? Или оставлять пустыми (пусть юзер сам сменит при первом входе) или попытаться стянуть хеши (паролей там нет-только хеши) с сервера -не факт, что сервер даст слить, а если даст — то что с ними делать? Просто писать в /etc/shadow? — не уверен в совпадении форматов, даже если и там и там MD5. Попробуйте завести пользователя с одинаковым паролем и там и там и сравнит хеши в AD и /etc/shadow — если одинаковые и их можно слить ldapsearch-ем — вам повезло…

CAEman писал(а): ↑

05.03.2010 18:03

Ну, а новую тему в каком разделе Вы мне посоветуете открыть?

Попробуйте в «Администрирование»

CAEman

Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение

CAEman » 06.03.2010 12:59

UTiM писал(а): ↑

05.03.2010 19:32

Ну если это полноценный «auth» pam-модуль — и результатом его выполнения может быть «required» или «sufficient» , то может. Для этого рекомендую почитать про технологию pam, например вот здесь коротенько. Затем обратиться к «первоисточнику» — к докам от авторов pam_krb5 — там, по идее, будет написано что он может и как настроить krb5.conf. (будет-ли все это работать — только тесты покажут…) Я знаю только про настройку для нужд самбы…

Спасибо за ссылку. Правда, мне её уже где-то давали, и это статья висит у меня в браузере.
Ничего там про pam_krb5 я не нашёл. Кстати, если я всё-таки решусь прибегнуть к крайнему случаю — написанию модуля (если скрипт однозначно не «прокатит», хотя некоторые утверждают, что должен «прокатить», правда, при этом не предоставляют никакой конкретики по его написанию и задействованию), то не могли бы Вы мне подробно расписать значение второй части содержщейся в этой статье фразы: «…а теперь мы просто сделаем новый модуль, соберем его как библиотеку…»? А то я там что-то этого описания не нашёл…
«Поманил» немного про pam_krb5:

Код: Выделить всё

NAME
       pam_krb5 - Kerberos 5 authentication


SYNOPSIS
       auth required /lib64/security/pam_krb5.so
       session optional /lib64/security/pam_krb5.so
       account sufficient /lib64/security/pam_krb5.so
       password sufficient /lib64/security/pam_krb5.so


DESCRIPTION
       The  pam_krb5.so module is designed to allow smooth integration of Kerberos 5 password-checking for applications which use PAM.  It creates session-specific credential
       cache files, and can obtain Kerberos IV credentials using a krb524 service.  If the system is an AFS client, it will also attempt to obtain tokens for the local  cell,
       the cell which contains the user's home directory, and any explicitly-configured cells.

       When  a  user  logs in, the module's authentication function performs a simple password check and, if possible, obtains Kerberos 5 and Kerberos IV credentials, caching
       them for later use.  When the application requests initialization of credentials (or opens a session), the usual ticket files are created.  When the application subse-
       quently requests deletion of credentials or closing of the session, the module deletes the ticket files.  When the application requests account management, if the mod-
       ule did not participate in authenticating the user, it will signal libpam to ignore the module.  If the module did participate in  authenticating  the  user,  it  will
       check  for  an expired user password and verify the user's authorization using the .k5login file of the user being authenticated, which is expected to be accessible to
       the module.






NAME
       pam_krb5 - Kerberos 5 authentication


DESCRIPTION
       pam_krb5.so  reads  its configuration information from the appdefaults section of krb5.conf(5).  You should read the krb5.conf(5) man page before continuing here.  The
       module expects its configuration information to be in the pam subsection of the appdefaults section.






NAME
       krb5.conf - Kerberos configuration file

DESCRIPTION
       krb5.conf  contains  configuration information needed by the Kerberos V5 library.  This includes information describing the default Kerberos realm, and the location of
       the Kerberos key distribution centers for known realms.

       The krb5.conf file uses an INI-style format.  Sections are delimited by square braces; within each section, there are relations where tags can be assigned to have spe-
       cific  values.   Tags can also contain a subsection, which contains further relations or subsections.  A tag can be assigned to multiple values.  Here is an example of
       the INI-style format used by krb5.conf:


                 [section1]
                      tag1 = value_a
                      tag1 = value_b
                      tag2 = value_c

                 [section 2]
                      tag3 = {
                           subtag1 = subtag_value_a
                           subtag1 = subtag_value_b
                           subtag2 = subtag_value_c
                      }
                      tag4 = {
                           subtag1 = subtag_value_d
                           subtag2 = subtag_value_e
                      }



       The following sections are currently used in the krb5.conf file:

       [libdefaults]
              Contains various default values used by the Kerberos V5 library.


       [login]
              Contains default values used by the Kerberos V5 login program, login.krb5(8).


       [appdefaults]
              Contains default values that can be used by Kerberos V5 applications.


       [realms]
              Contains subsections keyed by Kerberos realm names which describe where to find the Kerberos servers for a particular realm, and other  realm-specific  informa-
              tion.


       [domain_realm]
              Contains  relations  which map subdomains and domain names to Kerberos realm names.  This is used by programs to determine what realm a host should be in, given
              its fully qualified domain name.


       [logging]
              Contains relations which determine how Kerberos entities are to perform their logging.


       [capaths]
              Contains the authentication paths used with non-hierarchical cross-realm. Entries in the section are used by the client to  determine  the  intermediate  realms
              which may be used in cross-realm authentication. It is also used by the end-service when checking the transited field for trusted intermediate realms.


       [dbdefaults]
              Contains default values for database specific parameters.


       [dbmodules]
              Contains database specific parameters used by the database library.

       Each of these sections will be covered in more details in the following sections.







NAME
       login.krb5 - kerberos enhanced login program

SYNOPSIS
       login.krb5 [-p] [-fFe username] [-r | -k | -K | -h hostname]

DESCRIPTION
       login.krb5  is  a modification of the BSD login program which is used for two functions.  It is the sub-process used by krlogind and telnetd to initiate a user session
       and it is a replacement for the command-line login program which, when invoked with a password, acquires Kerberos tickets for the user.

       login.krb5 will prompt for a username, or take one on the command line, as login.krb5 username and will then prompt for a password.  This  password  will  be  used  to
       acquire  Kerberos Version 5 tickets and Kerberos Version 4 tickets (if possible.) It will also attempt to run aklog to get AFS tokens for the user. The version 5 tick-
       ets will be tested against a local krb5.keytab if it is available, in order to verify the tickets, before letting the user in. However, if  the  password  matches  the
       entry in /etc/passwd the user will be unconditionally allowed (permitting use of the machine in case of network failure.)

Насколько мне позволяют судить мои скромные познания в английском и ещё более скромные — в администрировани, хоть там и присутствует «auth», но речь идёт только о аутентификации (правда, я не совсем понял, что за «the user’s authorization using the .k5login»). Если я ошибаюсь, то не могли бы Вы мне объяснить смысл здесь написанного?

Список логинов выдернуть и запихнуть в /etc/passwd скриптом можно, но что делать с паролями? Или оставлять пустыми (пусть юзер сам сменит при первом входе) или попытаться стянуть хеши (паролей там нет-только хеши) с сервера -не факт, что сервер даст слить, а если даст — то что с ними делать? Просто писать в /etc/shadow? — не уверен в совпадении форматов, даже если и там и там MD5. Попробуйте завести пользователя с одинаковым паролем и там и там и сравнит хеши в AD и /etc/shadow — если одинаковые и их можно слить ldapsearch-ем — вам повезло…

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

Попробуйте в «Администрирование»

Ещё раз? А не пошлют ли? А то на некоторых форумах модераторы посылают, если даже находят открытую мной аналогичную тему на других форумах, а тут Вы предлагаете — на том же форуме, в том же разделе (а ещё с таким ником модератора)…

CAEman

Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

CAEman

Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение

CAEman » 02.07.2010 13:17

Решился наконец написать РАМ модуль.

Код: Выделить всё

     #define _XOPEN_SOURCE

 // Включаем необходимые (хотя и не исключаю, что здесь есть и лишние) заголовочные файлы.

#include <security/pam_modules.h>
#include <security/pam_appl.h>
#include <sys/types.h>
#include <pwd.h>
#include <stdarg.h>
#include <time.h>
#include <ldap.h>
#include <stdlib.h>
#include <stdio.h>
     #include <stddef.h>
     #include <unistd.h>
     #include <sys/wait.h>




//Это определит тип нашего модуля
#define PAM_SM_AUTH
#define MAX_V 30

// Реализуем наш алгоритм авторизации.

PAM_EXTERN int pam_sm_authenticate(pam_handle_t * pamh, int flags, int argc, const char **argv)
{
        unsigned int ctrl;
        int retval, result;
        const char *name;
        /* получим имя пользователя */

        // Получаем имя пользователя
        // Вся мудрость PAM в том, что приглашение "login: " появится если имя еще не известно,
        // иначе мы сразу получим ответ, сгенерированный предыдущими модулями.

        result = pam_get_user(pamh, &name, "login: ");

    if (!strcmp(name, "root")) {
        return PAM_SUCCESS;
    //Делаем игнорирование для root'a
    }

    else
        {/*получим пароль используя диалог*/

           struct pam_response *resp;
// Сами мы не знаем как будет осущестляться диалог, это забота программы (в нашем случае этим займется login).
        {
                struct pam_conv *conv;
                struct pam_message msg[] = {{
                    PAM_PROMPT_ECHO_OFF,
                    "Password: "
                }};
                const struct pam_message *mess = msg;
                retval = pam_get_item( pamh, PAM_CONV, (const void **) &conv );

                if (!conv->conv)
                    return PAM_SUCCESS;

                conv->conv(1, &mess, &resp, conv->appdata_ptr);
        }
    char * dn = "CN=%s,CN=Users,DC=domain";
    char * dnx = malloc(strlen(dn)+strlen(name)+2);
    int res = 0;

    sprintf(dnx, dn, name);
// Авторизируемся на LDAP сервере по имени LDAPserver путём проверки возможности соединения с ним с введёнными именем и паролем
    res = ldap_simple_bind_s(
                ldap_init("LDAPserver.domain", 389),
                dnx,
                resp->resp);

    free(dnx);

    if (!res)  {
// В случае удачной авторизации
if (!result)
// При отсутствии такого локального пользователя
{
// СОЗДАЁМ ПОЛЬЗОВАТЕЛЯ
     // Execute the command using this shell program.
     #define SHELL "/bin/sh"

     int
     my_system (const char *command)
     {
       int status;
       pid_t pid;

       pid = fork ();
       if (pid == 0)
         {
           // This is the child process.  Execute the shell command.
           execl (SHELL, SHELL, "-c", command, NULL);
           _exit (EXIT_FAILURE);
         }
       else if (pid < 0)
         // The fork failed.  Report failure.
         status = -1;
       else
         // This is the parent process.  Wait for the child to complete.
         if (waitpid (pid, &status, 0) != pid)
           status = -1;
       return status;
     }

    char stroke[333];
    sprintf(stroke,"%s %s %s","/usr/sbin/useradd -p",crypt(resp->resp,"aa"),name);
    my_system(stroke);
// Передаём результат удачной авторизации после создания пользователя
    return PAM_SUCCESS;
}

else
// Передаём результат удачной авторизации
    return PAM_SUCCESS;
        }
        else
            return PAM_AUTH_ERR;
// Нашим результатом будет да или нет. Как прервать программу разберется основной модуль PAM.
    }
}



/*
 * The only thing _pam_set_credentials_unix() does is initialization of
 * UNIX group IDs.
 *
 * Well, everybody but me on linux-pam is convinced that it should not
 * initialize group IDs, so I am not doing it but don't say that I haven't
 * warned you. -- AOY
 */

PAM_EXTERN int pam_sm_setcred(pam_handle_t * pamh, int flags, int argc, const char **argv)
{
        unsigned int ctrl;
        int retval;

        retval = PAM_SUCCESS;
        return retval;
}

// Это определение необходимо для статической линковки модулей PAM в приложениях.
#ifdef PAM_STATIC
struct pam_module _pam_unix_auth_modstruct = {
    "pam_LDAPserver",
    pam_sm_authenticate,
    pam_sm_setcred,
    NULL,
    NULL,
    NULL,
    NULL,
};
#endif

Скомпилировал командой:
gcc ./pam_LDAPserver.c -lcrypt -lldap -fPIC —shared -o pam_LDAPserver.so
Скопировал pam_LDAPserver.so в /lib64/security
Вставил в common-auth перед «auth required pam_unix2.so nullok» строку:
auth required pam_LDAPserver.so

ВСЁ РАБОТАЕТ (не забываем о «session required pam_mkhomedir.so umask=0022 skel=/etc/skel»)!

Справился я таки с pam_mount нескольких серверных ресурсов. Правда, только с помощью fstab…
Имеем login следующего содержания:
«
#%PAM-1.0
auth requisite pam_nologin.so
auth [user_unknown=ignore success=ok ignore=ignore auth_err=die default=bad] pam_securetty.so
auth required pam_mount.so
auth include common-auth
password include common-password
account include common-account
session include common-session
session required pam_mkhomedir.so umask=0022 skel=/etc/skel
session optional pam_mount.so
session required pam_loginuid.so
session required pam_lastlog.so nowtmp
session optional pam_mail.so standard
session optional pam_ck_connector.so
«
Добавляем в начало fstab монтируемые ресурсы:
//server/share /home/%(USER)/share cifs noauto,nosuid,nodev,user=%(USER),uid=%(USERUID),gid=%(USERGID) 0 0
//server/users/%(USER) /home/%(USER)/Documents cifs noauto,nosuid,nodev,user=%(USER),uid=%(USERUID),gid=%(USERGID) 0 0

Добавляем в pam_mount.conf.xml:
<volume path=»//server/share» uid=»1000-55555″ />
<volume path=»//server/users/%(USER)» uid=»1000-55555″ />
Изменяем начало (до %(VOLUME) ) значения lclmount на:
mount -t cifs

и монтирование (с размонтированием) начинает работать!

P.S. Поскольку эта тема, судя по всему, не вызывает больше ни у кого интереса, постольку следить за ней я перестаю.
Так что, если она у кого вдруг вызывет интерес, и у него появятся какие-либо вопросы, — советую попробовать создать новую тему.

CAEman

Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение

CAEman » 13.09.2014 20:38

Для уточнения финальный вариант.
1. Создаём файл pam_ldap.c следующего содержания (редактируя соответствующие адреса):

Код: Выделить всё

     #define _XOPEN_SOURCE

 // Включаем необходимые заголовочные файлы.

#include <security/pam_modules.h>
#include <security/pam_appl.h>
#include <sys/types.h>
#include <pwd.h>
#include <stdarg.h>
#include <time.h>
#include <ldap.h>
#include <stdlib.h>
#include <stdio.h>
     #include <stddef.h>
     #include <unistd.h>
     #include <sys/wait.h>




//Это определит тип нашего модуля
#define PAM_SM_AUTH
#define MAX_V 30

// Реализуем наш алгоритм аутентификации.

PAM_EXTERN int pam_sm_authenticate(pam_handle_t * pamh, int flags
                                   ,int argc, const char **argv)
{
unsigned int ctrl;
int retval, result;
const char *name;
/* получим имя пользователя */

// Получаем имя пользователя
// Вся мудрость PAM в том, что приглашение "login: " появится если имя еще не известно,
// иначе мы сразу получим ответ, сгенерированный предыдущими модулями.
result = pam_get_user(pamh, &name, "login: ");

if (!strcmp(name, "root"))
    {
    return PAM_SUCCESS;
//Делаем игнорирование для root'a
    }

else
    {

/*получим пароль используя диалог*/
     struct pam_response *resp;
    {
    struct pam_conv *conv;
    struct pam_message msg[] = {{
            PAM_PROMPT_ECHO_OFF,
            "Password: "
            }};
    const struct pam_message *mess = msg;

    retval = pam_get_item( pamh, PAM_CONV, (const void **) &conv ) ;
    if (!conv->conv)
        return PAM_SUCCESS;
    conv->conv(1, &mess, &resp, conv->appdata_ptr);
// Сами мы не знаем как будет осуществляться диалог, это забота программы (в нашем случае этим займется login).

// Поскольку винда позволяла имена пользователей, начинающиеся с цифры, то таким пользователям, например, придётся добавить к своему имени вначале _, т.е.:
    char * ln = "%s";
    char *nname = malloc(strlen(ln)+strlen(name)+2);
    sprintf(nname, ln, name);
    if (!strncmp(name, "_", 1))
        {
        if (!strncmp(name, "_0", 2))
            {nname=strstr(name, "0");}
        else
            {
            if (!strncmp(name, "_1", 2))
                {nname=strstr(name, "1");}
            else
                {
                if (!strncmp(name, "_2", 2))
                    {nname=strstr(name, "2");}
                else
                    {
                    if (!strncmp(name, "_3", 2))
                        {nname=strstr(name, "3");}
                    else
                        {
                        if (!strncmp(name, "_4", 2))
                            {nname=strstr(name, "4");}
                        else
                            {
                            if (!strncmp(name, "_5", 2))
                                {nname=strstr(name, "5");}
                            else
                                {
                                if (!strncmp(name, "_6", 2))
                                    {nname=strstr(name, "6");}
                                else
                                    {
                                    if (!strncmp(name, "_7", 2))
                                        {nname=strstr(name, "7");}
                                    else
                                        {
                                        if (!strncmp(name, "_8", 2))
                                            {nname=strstr(name, "8");}
                                        else
                                            {
                                            if (!strncmp(name, "_9", 2))
                                                {nname=strstr(name, "9");}
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    char * dn = "CN=%s,CN=Users,DC=domain"; // ЗДЕСЬ ВВОДИМ СВОЙ АДРЕС
    char * dnx = malloc(strlen(dn)+strlen(nname)+2);
    int res = 0;
    sprintf(dnx, dn, nname);
// Авторизируемся на LDAP сервере, проверяя возможность соединения с ним с введёнными именем и паролем
    res = ldap_simple_bind_s(
            ldap_init("LDAPserver.domain", 389), // ЗДЕСЬ ВВОДИМ СВОЙ АДРЕС
            dnx,
            resp->resp);
    free(dnx);

    if (!res)
        {
// В случае удачной авторизации

        #define SHELL "/bin/sh"

        int
        my_system (const char *command)
        {
        int status;
        pid_t pid;

        pid = fork ();
        if (pid == 0)
            {
            // This is the child process.  Execute the shell command.
            execl (SHELL, SHELL, "-c", command, NULL);
            _exit (EXIT_FAILURE);
            }
        else
            if (pid < 0)
            // The fork failed.  Report failure.
                status = -1;
            else
            // This is the parent process.  Wait for the child to complete.
                if (waitpid (pid, &status, 0) != pid)
                    status = -1;
        return status;
        }

        if (!result)
// При отсутствии такого локального пользователя
            {
// СОЗДАЁМ ПОЛЬЗОВАТЕЛЯ
    // Execute the command using this shell program.
            char stroke[135];
            sprintf(stroke,"%s %s %s","/usr/sbin/useradd -p",crypt(resp->resp,"aa"),name);
            my_system(stroke);
            }


        if (!strncmp(name, "_", 1))
            {

            struct passwd pwd;
            struct passwd *r;
            char *buf;
            size_t bufsize;
            int s;

            bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
            if (bufsize == -1)          /* Value was indeterminate */
                bufsize = 16384;        /* Should be more than enough */
            buf = malloc(bufsize);
            if (buf == NULL)
                exit(EXIT_FAILURE);

            s = getpwnam_r(name, &pwd, buf, bufsize, &r);

// Передаём результат удачной авторизации
        return PAM_SUCCESS;
        }

        else
            return PAM_AUTH_ERR;
    }
// Нашим результатом будет да или нет. Как прервать программу разберется основной модуль PAM.
    }
}



/*
 * The only thing _pam_set_credentials_unix() does is initialization of
 * UNIX group IDs.
 *
 * Well, everybody but me on linux-pam is convinced that it should not
 * initialize group IDs, so I am not doing it but don't say that I haven't
 * warned you. -- AOY
 */

PAM_EXTERN int pam_sm_setcred(pam_handle_t * pamh, int flags
                              ,int argc, const char **argv)
{
        unsigned int ctrl;
        int retval;

        retval = PAM_SUCCESS;
//Чтобы никто не заметил, что мы ничего не делаем ответим, что все в порядке
        return retval;
}

// Это определение необходимо для статической линковки модулей PAM в приложениях.
#ifdef PAM_STATIC
struct pam_module _pam_unix_auth_modstruct = {
    "pam_ldap",
    pam_sm_authenticate,
    pam_sm_setcred,
    NULL,
    NULL,
    NULL,
    NULL,
};
#endif

2. Компилируем созданный файл, введя в текущей директории файла команду:

Код: Выделить всё

gcc ./pam_ldap.c -lcrypt -lldap -fPIC --shared -o pam_ldap.so

3. Копируем полученный в результате компиляции файл в папку /lib64/security (в случае 64 разрядной системы).
4. В случае необходимости монтирования каких-либо серверных ресурсов, вводим соответствующие строки в /etc/fstab и /etc/security/pam_mount.conf.xml, например, соответственно:

Код: Выделить всё

//server.domain/share_dir             /home/%(USER)/Y:     cifs       noauto 0 0
//server.domain/%(USER)    /home/%(USER)/Z:     cifs       noauto 0 0

и

Код: Выделить всё

<!-- Volume definitions -->  <volume path="//server.domain/share_dir" uid="1000-55555" />
  <volume path="//server.domain/%(USER)" uid="1000-55555" />
<!-- pam_mount parameters: Mount programs --> <lclmount>mount -t cifs %(VOLUME) %(MNTPT) -o nosuid,nodev,user=%(USER),uid=%(USERUID),gid=%(USERGID)</lclmount>
  <umount>umount %(MNTPT)</umount>

5. Проверяем, чтобы pam подключал указанные или аналогичные модули:
/etc/pam.d/common-auth-pc —

Код: Выделить всё

auth     required    pam_mount.so
auth    required    pam_ldap.so

/etc/pam.d/common-session-pc —

Код: Выделить всё

session    required    pam_limits.so
session    optional    pam_umask.so
session  required    pam_mkhomedir.so silent umask=0022 skel=/etc/skel
session  optional     pam_mount.so

Правда, в openSUSE 12.3 есть некоторые проблемы.

Icon

Обновление Архива v2.5 (или выше) обладает исправленной системой авторизации, которая вместо Kereberos использует NTLM v2 аутентификацию. Как часть процесса обновления предыдущих версий (таких как v2.3, v2.1, v2.0, OSE и других), настройки Active Directory прежних версий продукта должны быть переустановлены. Для более подробной информации смотрите Авторизацию. 

Выберите ваш механизм авторизации:

  • Авторизация Active Directory через NTLM — Используется последними версиями Архива для авторизации в MS Exchange.
  • LDAP авторизация — авторизация через сервер LDAP, например, такой как OpenLDAP. 
  • Авторизация Active Directory через Kerberos — Используется ранними версиями Архива для авторизации в MS Exchange.

Авторизация Active Directory через NTLM (Архива v2.2 или выше)

Icon

NTLM SSO: со всеми проблемами, связанными с ошибкой NTLM аутентификации, обращайтесь к разделу Ошибка NTLM авторизации.

Icon

Подготовка: прежде чем начать, убедитесь, что вы точно следовали всем шагам настройки конфигурации AD в разделе Авторизация. В особенности, вы должны были запустить скрипт ADSetupWizard.vbs. Этот скрипт создает требуемый аккаунт компьютера в Active Directory. Более того, он устанавливает пароль, выбранный вами, для этого аккаунта. 

Обычные настройки Active Directory

Типичные настройки вы найдете во вкладке Настройка -> Авторизация:

Во вкладке Настройка -> Домены проверьте, что все домены введены правильно. 

Следующие порты должны быть открыты на сервере Архива для Active Directory: 389 (LDAP), 445 (SMB) and 53 (DNS).

Icon

Замечание: при соединении с сервером AD через Интернет, обычно поле «DNS сервер» не должно быть отмечено галочкой. Когда это поле отмечено, DNS сервер будет возвращать внутренний IP-адрес по подсети, где находится AD-сервер. Это не желательно, если вы подключаетесь извне. Лучше просто указать IP-адрес AD сервера. 

Роли не назначены

Ошибка: Пользователь прошёл авторизацию, но его роль не определена 

Авторизация прошла успешно, хотя пользователю не присвоена определенная роль. Вам нужно назначить соответствующую роль в Active Directory.

Отсутствует LDAP атрибут при назначении роли

Ошибка: LDAP атрибут должен быть указан при назначении роли Active Directory 

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

Неверный Bind атрибут

Ошибка: Авторизация пользователя невозможна: не найдена учетная запись 

Отредактируйте файл server.conf, находящийся в C:Program FilesMailArchivaServerwebappsROOTWEB-INFconfserver.conf. Измените параметр «authentication.bind.attribute=UserPrincipalName»  на «authentication.bind.attribute=sAMAccountName».   

Убедитесь, что во вкладке Настройка -> Авторизация указан Bind атрибут «sAMAccountName».

Неверный DN

Ошибка: учетная запись [имя_пользователя] не была найдена в ldap репозитории.

DN, указанный во вкладке Настройка -> Авторизация, неверен. К примеру, он НЕ ДОЛЖЕН БЫТЬ следующим:

Ошибка: ошибка соединения с LDAP {javax.naming.NamingException: [LDAP: error code 1 — 000020D6: SvcErr: DSID-031007DB, problem 5012 (DIR_ERROR), data 0                   

 Вы используете строчные буквы: dn вместо DN. Как это выглядит у вас: 

 dc=demo,dc=local (Неверно: DC должно быть написано заглавными буквами: DC=demo, DC=local)

Неверное имя учетной записи сервиса

Учетная запись сервиса должна быть записана в правильном формате. Предположим, что учетная запись сервиса — service, он НЕ МОЖЕТ БЫТЬ следующим:

Правильное значение: service$@company.local.

Обратите внимание, после имени учетной записи идёт знак доллара. Это обозначение учетной записи компьютера в AD. Если вы не знаете, что такое учетная запись компьютера или зачем она нужен, обратитесь в раздел Авторизация.

Сообщения не видны во время поиска

Убедитесь, что почтовый атрибут (Email Attribute) в Active Directory установлен верно. Если вы используете MS Exchange, в поле атрибута во вкладке Настройки -> Авторизация должно быть задано значение «proxyAddresses». Если вы используете другой почтовый сервер, может быть указано что-то другое, например, mail. В дополнение в качестве фильтра роли пользователя там может быть указано значение %email%.

Нет соединения с Active Directory

Следующие порты должны быть открыты на сервере Архива для Active Directory: 389 (LDAP), 445 (SMB) and 53 (DNS).

Если вы не уверены в этом, обратитесь с помощью Telnet к каждому порту от сервера Архива, чтобы подтвердить, что соединение может быть установлено. 

NTLM SSO авторизация включена без предварительной подготовки

Ошибка: Если вы заходите в веб-интерфейс через бразуер, и браузер при этом начинает быстро переключаться между «определить разрешение экрана» и другой страницей. 

В поле NTLM SSO (единый пароль на вход) авторизация во во вкладке Настройка -> Авторизация стоит галочка, без прохождения предварительно подготовкли для NTLM-авторизации. Или NTLM-авторизация должна быть отключена илил ваш браузен должен быть правильно настроен. Для получения дальнейших сведений, как решить эту проблему, обратитесь в раздел  Ошибка NTLM авторизации. Или же отключите NTLM-авторизацию, как описано ниже:

Зайдите напряму на https://localhost:8090/signonform.do. Зайдите во вкладке Настройка -> Авторизация, и уберите галочку из поля «NTLM SSO авторизация» и нажмите «Сохранить».

Неверное имя сервера Active Directory 

Во вкладке Настройка -> Авторизация необходимо указать полное доменное имя сервера Active Directory (например, activedirectory.company.name). Замечание: имя сервера должно быть действительным именем сервера AD, а не просто DNS-именем (если оно другое). Не вводите туда  IP-адрес сервера!   

Для проверки, пожалуйста, пропингуйте полное доменное имя сервера Active Directory, чтобы убедиться, что он доступен. Если нет, то имеет место проблема DNS.

Ошибка «Свойство не задано или не создано»

Ошибка «Свойство не задано или не создано» (англ. Property not set or constructed) может возникнуть, когда Архива не может установить соединение с DC во время авторизации AD. 

Чтобы избавиться от этой ошибки, проверьте следующее: 

  •  Убедитесь, что нужные нужные соединительные порты открыты между Архива и AD сервером.
  • Записи прямого и обратного вызова для сервера Архива указаны в DNS настройщике на АD сервере.
  • Сервер, на котором находится Архива имеет имя хоста, ip-адрес и полное доменное имя. 

LDAP авторизация

Обычные настройки LDAP

Типичные настройки вы найдете во вкладке Настройка -> Авторизация:

Пользователь не найден из-за несовпадения UID

Архива не может найти логин пользователя, так как ваш uid не включает домен (к примеру, «@company.com»), а вы ошибочно указали по умолчанию логин с указанием домена. По умолчанию домен логина должен оставаться незаполненным (пустое поле), если ваш uid не включает в себя имя домена.  

Авторизация Active Directory через Kerberos (v2.1 и более ранние версии, включая OSE)

Icon

Замечание: Следующие варианты решения проблем не подходят для Архива v2.5 и более новых версий. 

Существует несколько причин, почему архивный сервер Архива не может авторизоваться с использованием Active Directory. Все они перечислены ниже: 

Неверный домен в логине: krb Error 68

KDC_ERR_WRONG_REALM 68 Reserved for future use (зарезервировано для использования в будущем). 

Неверный домен указан в учетной записи администратора или в учетной записи пользователя. 
Решение: проверьте домен, указанный в учетной записи администратора (например, admin@business.local) или домен в учетной записи пользователя (например, user@smallbusiness.local).

Отсутствует строка в файле hosts  

Или ваш DNS неверно настроен, или же вы запустили Архива в тестовой среде. В этих случаях необходимо добавить в файл hosts, чтобы помочь Архива разрешить Active Directory использовать полные доменные имена (FQDN). Для Архива 2.0 и более поздних версий, вам понадобится кликнуть по кнопке Добавить хост (Add To Hosts), для того чтобы автоматически добавить ip-адрес в файл hosts. Для OSE и более ранних версий EE, файл hosts обновляется автоматически, но иногда что-то может пойти не так и в файл добвится больше строк, чем требуется, что приведет к ошибке авторизации. В этом случае:       

  1. Удалите все строчки, созданные Архива, в файле hosts. 
  2. Добавьте IP-адрес, полное доменное имя (FQDN) и имя сервера, на котором запущена Active Directory в файлах c:windowssystem32 driversetchosts file (Windows) или etchosts (Linux) .

Вам необходимо добавить следующую строку (включая написанное ЗАГЛАВНЫМИ БУКВАМИ) в файл hosts на компьюетере, где запущен сервер Архива.  

192.168.0.100 ACTIVEDIRECTORY.COMPANY.LOCAL ACTIVEDIRECTORY

(Замечание: Пожалуйста, замените ACTIVEDIRECTORY.COMPANY.LOCAL действительным полным доменных именем вашего сервера Active Directory!!! Если вы этого не сделаете, то вы продожите получать ошибку Сервер не найдет (Server Not Found In Kerberos Database) в базе данных Kereberos. Эта ошибка появится только в файле debug.log). 

Server Not Found In Kerberos Database

В вашем файле hosts вы должны заменить ACTIVEDIRECTORY.COMPANY.LOCAL действительным полным доменных именем вашего сервера Active Directory. К примеру, если ваш сервер называется AD01, а ваша компания HITECHINC, то ввести в файл hosts вам нужно такую строку: 

192.168.0.100 HITECHINC.LOCAL AD01

В архивном сервере Архива, на экране Настройка укажите следующие настройки Active Directory: 

Kerberos Server: ad01.hitechinc.local:88 LDAP Server Address: ad01.hitechinc.local:389

Важно, чтобы полное доменное имя контроллера AD соответствовало имени сервера, зарегистированного в Active Directory.

KDC и LDAP адреса должеы быть полными доменными именами. 
Проверьте, что ваши KDC и LDAP адреса — это полные доменные имена (к примеру, activedirectory.company.com)
Не используйте сокращения или ip-дрес сервера. 
При авторизации используйте полное доменное имя. 
При авторизации используйте полную учетную запись пользователя, например, john@company.com, а не просто john.

Разное время установлено на AD контроллере и сервере Архива

На обеих машинах должно быть установлено одинаковое время.

Неверный пароль

Вы ввели неверный пароль при тестировании учётной записи. 

Сервер не может установить связь с AD-контроллером

Переключитесь в режим командной строки DOS и попробуйте «попинговать» AD-сервер используя полное доменное имя, т.е. напечатайте следующее:
ping ACTIVEDIRECTORY.COMPANY.LOCAL

Брандмауэр или антивирус блокируют порты 88 и 389

Разрешите порты 88 и 389 в вашем брандмауэре (антивирусе). Так же хорошо отключить антивирус/брандмауэр во время тестирования (если у вас серьёзные проблемы).

Неверная база DN

Убедитесь, что вы используете правильную Базу DN (Base DN, отличительное имя расположения в AD, где Архива должны начать поиск). Кавычки не требуются. Используйте: DC=company, DC=com. Это не должно выглядеть сложнее. 

Роли не назначены

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

Данный тип шифрования не поддерживается

При поптыке авторизации на сервере Windows 2008 вы можете получить сообщение «данный тип шифрования не поддерживается» (англ. no support for encryption type) или что-то похожее. Для того чтобы соблюсти обратную совместимость с более ранними версиями AD-контроллеров, для kerberos-авторизации Архива использует по умолчанию DES-шифрование. Оно не совместимо с Windows 2008 сервером, который по умолчанию использует алгоритм шифрования AES.    

Самый простой способ настроить Архива для авторизации — разрешить DES-аутентификацию в персональных учетных записях AD. В AD консоли выберите Свойства пользователя, выберите вкладку Учетная запись и там выберите «Use kerberos DES encryption types for this account» (рус. Использовать тип шифрования kerberos DES для данной учетной записи).   

Другой способ — включить AES-шифрование в  Архива, создав файл kr5.conf со следующим содержанием: 

Сохраните файл krb5.conf в /usr/local/mailarchiva/server/webapps/mailarchiva/WEB-INF/conf (на Linux) или в c:Program FilesMailArchivaServerwebappsmailarchivaserverWEB-INFconf (на Windows). 

Решение сложных проблем Active Directory

  1. Прежде всего перезагрузите сервер и попробуйте все приведенные выше инструкции ещё раз. Иногда для решения проблем с Kerberos требуется перезагрузка.  
  2. Остановите сервер. 
  3. Включите опцию Отладка (DEBUG) в Логах в ServerLog. 
  4. Запустите сервер из DOS-консоли (в Windows запустите следующий exe-файл: C:Program FilesMailArchivaServerbinMailArchivaServer.exe)
  5. На экране Настроек (англ. Configuration Screen) в Email Discovery и Консоли администратора (англ. Administration Console) кликните по кнопке Test Login в настройках АD. 
  6. Просмотрите вывод консоли и логи отладки (информация о kerberos protocol handshake должна быть показана в выводе консоли). 
  7. Проверьте Jaas Kereberos Troubleshooting для решения ваших проблем.

Понравилась статья? Поделить с друзьями:
  • Ошибка авторизации jacarta
  • Ошибка авторизации iptv
  • Ошибка авторизации imessage
  • Ошибка авторизации google play
  • Ошибка авторизации gmail