AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-66849

Brian Bauman's questions

Martin Hope
Brian Bauman
Asked: 2021-03-05 16:42:07 +0800 CST

为 SSH 和 Samba 身份验证设置可组合 POSIX 组的最简单方法是什么?

  • 2

背景

我将我认为是相当普通的基础设施块放在一起,但遇到了很多问题,我不禁想知道是否有更简单的方法。


我需要能够执行以下操作:

  • 使用委派身份验证和基于组的权限将文件从 Linux 服务器安全地共享给 OSX、Linux 和 Windows 计算机上的数百名用户。
  • 允许基于组的 SSH 访问数十个 Linux 服务器,具有委派的身份验证和基于组的权限。
  • 能够创建由其他组和用户组成的组,最好是任意深度。
  • 能够允许基本任务的自助服务(密码更改和恢复,个人信息的有限编辑等)
  • 能够以最少的配置迁移现有服务器(运行各种 Linux 风格) - 因此尽可能坚持“标准”配置,尤其是客户端。

我希望能够选择执行以下操作:

  • 除基于密码的身份验证外,还支持公钥身份验证

对我来说,上述所有听起来都像是 LDAP + Samba 是唯一可行的方法,尤其是因为之前的实现使用了 FreeIPA/Samba。团队决定使用 OpenLDAP 和 LDAP Account Manager 来提供身份验证和目录服务,但实施过程却是一场噩梦。


OpenLDAP 设置

我的目录树具有以下结构:

 - dc=example,dc=com
   - ou=groups
     - cn=groupA
     - ...
   - ou=policies
     - cn=passwordDefault
     - ...
   - ou=services
     - cn=service1
     - ...
   - ou=users (
     - uid=user1
     - ...

用户有以下类别:

  • inetOrgPerson(结构)
  • posixAccount
  • 影子账户
  • sambaSamAccount
  • ppolicyUser
  • 密码自复位
  • ldapPublicKey
  • 一般信息

用户工作得很好。大多数 Linux 机器都使用sshd -> libpam-ldap -> libnss-ldapd -> nscd -> nslcdand coreutils -> libnss-ldapd -> nscd -> nslcd,因此getent passwd根本id [username]不需要任何特殊配置即可工作。

服务有以下类:

  • applicationProcess(结构)
  • 简单安全对象

服务只是内部服务(如 Gitlab)的简单 DN/pw 实体,可以直接联系 LDAP,这样我们就可以关闭匿名绑定而不切断它们。他们也工作得很好。(注意 - 一些服务实际上需要作为 POSIX 帐户存在,因此为简单起见将它们配置为用户)

策略是诸如密码策略之类的实体,它们不在此问题的范围内。

组一直是真正的问题,因此我将在下一节中详细讨论它们。


团体的问题

无论我做什么,我似乎都无法创建可组合的 POSIX 兼容组。在这种情况下,我使用“可组合”来表示以下内容。假设配置了这些组 - GroupA(User1、User2、User3)、GroupB(User4、User5)和 GroupC(User1、User5)。可组合组将允许创建动态 GroupD (GroupA, GroupC),有效成员资格为 (User1, User2, User3, User5)。 理想情况下,GroupD 也可以定义为 (GroupA, GroupC, User6)。此外,理想情况下,您可以继续嵌套多于一层的组。

OpenLDAP 和 LAM 有一些工具似乎适用于这类事情,但我不断遇到模式问题、设计问题、实现问题或三者的某种组合。

  • dynlist - 这个 OpenLDAP 覆盖允许您基于 LDAP 过滤器即时填充属性列表。您甚至可以拥有由用户和其他组组成的混合组!不幸的是,覆盖仅在直接查看它所附加的实体时触发。这意味着getent group [group](直接查看一个或多个组)有效,但groups [user](搜索用户在组中的存在)无效。nss这使得如果不将您自己的映射层或其他 LDAP 使用者写入,就不可能基于动态组进行 SSH 。此外,可能出于类似原因,您无法从其他 dynlist 组创建 dynlist 组。

  • memberof - 此 OpenLDAP 覆盖将自动更新memberOf用户的属性,以对应用户在组中的添加和删除。然而,它似乎需要使用基于 RFC2307 的类以外的组类posixGroup,因为它memberof需要基于 DN 的成员资格,而不是基于 uid 的成员资格。它实际上也无助于管理组本身。

  • 自动组 - 此OpenLDAP覆盖将自动从可配置属性中添加或删除用户 DN,对应于用户在可配置 LDAP 过滤器结果中的存在或不存在。这个覆盖似乎需要memberof安装,因为autogroup除非我包含olcAGmemberOfAd配置属性,否则安装会失败。它似乎也需要基于 DN 的成员资格,所以memberof它需要一个基于 RFC2307 以外的类posixGroup

我最初尝试使用 class 实现静态组posixGroup (structural),并使用附加labeledURIObject类来附加dynlist过滤器的动态组。这基本上奏效了,但我遇到了dynlist上面列出的缺点。

然后我尝试改用autogroup覆盖,但遇到了似乎需要基于 DN 的成员资格的问题。在这一点上,我觉得我必须尝试摆脱posixGroup结构类,因为似乎没有任何东西支持它。LAM似乎更喜欢使用 和 的组合groupOfNames,因为它包含一个功能,当两个属性都存在于同一个对象上时RFC2307bis-posixGroup,它可以自动member将属性与属性同步。memberUid所以我修改了posixAccountOpenLDAP 附带的模式,使其成为辅助而不是结构,并使用groupOfNames(结构)和修改的posixAccount类创建组。破解 OpenLDAP 的objectClass使用 RFC2307bis-esque 类来欺骗它的模式感觉就像 Not The Right Thing To Do™,但 OpenLDAP/LAM 似乎接受了它。这样做也使我能够memberof成功安装,这很好。

autogroup,但是,只有一半有效。虽然它会将用户添加到动态组(使用 可见groups [user]),但在将用户从基本组中删除时不会将其删除。 groupOfNames还要求其members字段始终至少有一个用户在其中,这对于与autogroup. 您必须使用初始设置它,但是一旦锁定属性member就无法删除虚拟成员。autogroupmember


配置

cn=模块{0},cn=配置

dn: cn=module{0}
objectClass: olcModuleList
cn: module{0}
olcModulePath: /usr/lib/ldap
olcModuleLoad: {0}back_mdb
olcModuleLoad: {1}ppolicy
olcModuleLoad: {2}autogroup
olcModuleLoad: {3}memberof

olcOverlay={1}memberof,olcDatabase={1}mdb,cn=config

dn: olcOverlay={1}memberof
objectClass: top
objectClass: olcConfig
objectClass: olcOverlayConfig
objectClass: olcMemberOf
olcOverlay: {1}memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfNames
olcMemberOfMemberAD: member
olcMemberOfMemberOfAD: memberOf

olcOverlay{2}autogroup,olcDatabase={1}mdb,cn=config

olcOverlay: {2}autogroup
structuralObjectClass: olcAutomaticGroups
olcAGattrSet: {0}labeledURIObject labeledURI member
olcAGmemberOfAd: memberOf

问题

最具体到最少:

  1. 为什么autogroup能够将用户添加到动态组,但不能删除它们?
  2. 有没有更简单的方法来实现这个用例?
  3. 我是否使用了错误的工具来完成这项工作?使用不同的 LDAP 实现、一些简单的客户端配置或完全非 LDAP 的东西,这个用例会更容易吗?
ldap openldap pam nss
  • 1 个回答
  • 509 Views
Martin Hope
Brian Bauman
Asked: 2019-04-12 12:23:37 +0800 CST

MySQL Cluster -> Galera MariaDB Cluster Replication 不工作,但没有错误

  • 0

我正在运行 MySQL Cluster 7.2 (MySQL 5.5) 的 2 节点主集群和运行带有 Galera 集群的 MariaDB 10.3 的 2 节点从集群(加上仲裁器)之间设置数据库迁移。我目前关闭了除了一个 Galera 集群的节点之外的所有节点,以简化编排。

配置显示正确,并且SHOW ALL SLAVES STATUS \G显示的所有内容都表明复制成功。 Read_并且Exec_Master_Log_Pos相互匹配以及主服务器报告的内容,没有记录错误等。事实上,将数据库添加到我们正在复制的主节点将在从节点中创建一个数据库。 但是,没有任何数据行被复制。

mariadb.err 中唯一的奇怪之处如下:

2019-04-11 18:31:19 101 [Warning] Master '[redacted]': Slave I/O: Notifying master by SET @master_binlog_checksum= @@global.binlog_checksum failed with error: Unknown system variable 'binlog_checksum', Internal MariaDB error code: 1193

主复制配置:

server-id=13
binlog-format = row
log-bin=mysql-bin
sync_binlog = 1

从属复制配置:

server-id               = 1
log_bin                 = /var/log/mysql/mariadb-bin
log_bin_index           = /var/log/mysql/mariadb-bin.index
expire_logs_days        = 10
max_binlog_size         = 100M
relay_log               = /var/log/mysql/relay-bin
relay_log_index         = /var/log/mysql/relay-bin.index
relay_log_info_file     = /var/log/mysql/relay-bin.info
slave_sql_verify_checksum = 0
log_slave_updates
read_only
binlog_format=row

显示主状态;

File: mysql-bin.000049
Position: 4494988
Binlog_Do_DB: ''
Binlog_Ignore_DB: ''

显示所有从属状态 \G

*************************** 1. row ***************************
               Connection_name: [redacted]13
               Slave_SQL_State: Slave has read all relay log; waiting for the slave I/O thread to update it
                Slave_IO_State: Waiting for master to send event
                   Master_Host: [redacted]
                   Master_User: replicant
                   Master_Port: 3306
                 Connect_Retry: 60
               Master_Log_File: mysql-bin.000049
           Read_Master_Log_Pos: 4494988
                Relay_Log_File: relay-bin-[redacted].000002
                 Relay_Log_Pos: 2982721
         Relay_Master_Log_File: mysql-bin.000049
              Slave_IO_Running: Yes
             Slave_SQL_Running: Yes
               Replicate_Do_DB: 
           Replicate_Ignore_DB: 
            Replicate_Do_Table: 
        Replicate_Ignore_Table: 
       Replicate_Wild_Do_Table: 
   Replicate_Wild_Ignore_Table: 
                    Last_Errno: 0
                    Last_Error: 
                  Skip_Counter: 0
Exec_Master_Log_Pos: 4494988
               Relay_Log_Space: 2983028
               Until_Condition: None
                Until_Log_File: 
                 Until_Log_Pos: 0
            Master_SSL_Allowed: No
            Master_SSL_CA_File: 
            Master_SSL_CA_Path: 
               Master_SSL_Cert: 
             Master_SSL_Cipher: 
                Master_SSL_Key: 
         Seconds_Behind_Master: 0
 Master_SSL_Verify_Server_Cert: No
                 Last_IO_Errno: 0
                 Last_IO_Error: 
                Last_SQL_Errno: 0
                Last_SQL_Error: 
   Replicate_Ignore_Server_Ids: 
              Master_Server_Id: 13
                Master_SSL_Crl: 
            Master_SSL_Crlpath: 
                    Using_Gtid: No
                   Gtid_IO_Pos: 
       Replicate_Do_Domain_Ids: 
   Replicate_Ignore_Domain_Ids: 
Parallel_Mode: conservative
                     SQL_Delay: 0
           SQL_Remaining_Delay: NULL
       Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
              Slave_DDL_Groups: 0
Slave_Non_Transactional_Groups: 0
    Slave_Transactional_Groups: 0
          Retried_transactions: 0
            Max_relay_log_size: 104857600
          Executed_log_entries: 28995
     Slave_received_heartbeats: 57
        Slave_heartbeat_period: 30.000
                Gtid_Slave_Pos: 
1 row in set (0.000 sec)

启动复制

在 master 上,我执行以下操作:

mysqldump -S /data/mysql/mysql.sock -u [redacted] -p --opt --skip-lock-tables --single-transaction --flush-logs --master-data=2 --databases [redacted] > replication.sql

然后我将 sql 复制到从服务器,并将其通过管道传输到 Galera 节点。这使从站与转储点保持同步。

然后我在从服务器上运行以下命令:

head -n100 replication.sql | grep "MASTER_LOG_POS"

获取正确的起始文件和复制位置,然后在 SQL 中运行以下命令:

CHANGE MASTER '[redacted]' TO MASTER_HOST='[redacted]', MASTER_USER='replicant', MASTER_PASSWORD='[redacted]', MASTER_LOG_FILE='[file]', MASTER_LOG_POS=[position];

在过去的几天里,我已经查看了该网站和其他网站上的数十篇帖子,但尚未找到解决方案。以下是一些证明勤奋的例子:

MySQL 复制不工作 - 没有错误- 我关闭了所有过滤以确保这不是问题。

mysql 复制失败(无错误) - 我们正在使用基于行的 bin-logging

MySQL 主从复制未更新- 这里没有真正的解决方案。我确认第一个答案列出的所有积极指标对我来说也是正确的。

MySQL 说复制很好,但没有复制数据- 不使用过滤,服务器 ID 不同等。

mysql
  • 1 个回答
  • 730 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve