All Projects → capricornxl → ad-password-self-service

capricornxl / ad-password-self-service

Licence: Apache-2.0 license
基于Python 3.8 + Django 3.2的密码自助平台,AD用户自助修改密码,结合<钉钉>/<企业微信>扫码验证信息后用户可自行重置密码、解锁自己的账号。

Programming Languages

python
139335 projects - #7 most used programming language
HTML
75241 projects
CSS
56736 projects
shell
77523 projects
javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to ad-password-self-service

Zxinglite
🔥 ZXing的精简版,优化扫码和生成二维码/条形码,内置闪光灯等功能。扫描风格支持:微信的线条样式,支付宝的网格样式。几句代码轻松拥有扫码功能 ,ZXingLite让集成更简单。(扫码识别速度快如微信)
Stars: ✭ 2,117 (+2685.53%)
Mutual labels:  scan, scancode
Ad Password Protection
Active Directory password filter featuring breached password checking and custom complexity rules
Stars: ✭ 210 (+176.32%)
Mutual labels:  active-directory, password
New-AdPasswordReminder
PowerShell script to email users that their password is soon expiring, along with info on how to change it. Designed to run as a scheduled task on a machine with the Active Directory PowerShell module installed.
Stars: ✭ 20 (-73.68%)
Mutual labels:  active-directory, password
gitlab-ldap-group-sync
Manage your gitlab groups with ldap / active directory
Stars: ✭ 21 (-72.37%)
Mutual labels:  ad, active-directory
Dllpasswordfilterimplant
DLL Password Filter Implant with Exfiltration Capabilities
Stars: ✭ 107 (+40.79%)
Mutual labels:  active-directory, password
crimson-spray
A lockout aware password sprayer
Stars: ✭ 11 (-85.53%)
Mutual labels:  active-directory, password
react-native-passmeter
Simple password strength meter for React Native.
Stars: ✭ 46 (-39.47%)
Mutual labels:  password
PowerShell-WindowsAdmin
A collection of scripts I've created over the years to administer things.
Stars: ✭ 35 (-53.95%)
Mutual labels:  active-directory
ad-privileged-audit
Provides various Windows Server Active Directory (AD) security-focused reports.
Stars: ✭ 42 (-44.74%)
Mutual labels:  active-directory
jekyll-password-protect
Password protect Jekyll posts (formerly jekyll-firewall)
Stars: ✭ 60 (-21.05%)
Mutual labels:  password
precis i18n
Python3 implementation of PRECIS framework (RFC 8264, RFC 8265, RFC 8266)
Stars: ✭ 16 (-78.95%)
Mutual labels:  password
ios-application
A native, lightweight and secure one-time-password (OTP) client built for iOS; Raivo OTP!
Stars: ✭ 581 (+664.47%)
Mutual labels:  password
jquery.pwstrength
A jQuery plugin to indicate the strength of passwords
Stars: ✭ 22 (-71.05%)
Mutual labels:  password
adalanche
Active Directory ACL Visualizer and Explorer - who's really Domain Admin?
Stars: ✭ 862 (+1034.21%)
Mutual labels:  active-directory
smbaudit
Perform various SMB-related attacks, particularly useful for testing large Active Directory environments.
Stars: ✭ 31 (-59.21%)
Mutual labels:  active-directory
multiOTPCredentialProvider
multiOTP Credential Provider is a V2 Credential Provider for Windows 7/8/8.1/10/2012(R2)/2016 with options like RDP only and UPN name support
Stars: ✭ 121 (+59.21%)
Mutual labels:  active-directory
AD-webmanager
A web interface for administration of Active Directory Domains, made in Python, with focus on easy of use and simplicity.
Stars: ✭ 26 (-65.79%)
Mutual labels:  active-directory
Update-AllUsersQA
Update-AllUsersQA is a PowerShell script used to change or disable the security questions and answers for local users in a Windows 10 machine.
Stars: ✭ 21 (-72.37%)
Mutual labels:  password-reset
PSSystemAdministrator
A PowerShell module for managing users and computers and gathering information in a Windows Active Directory environment.
Stars: ✭ 59 (-22.37%)
Mutual labels:  active-directory
BTPS-SecPack
This repository contains a collection of PowerShell tools that can be utilized to protect and defend an environment based on the recommendations of multiple cyber security researchers at Microsoft. These tools were created with a small to medium size enterprise environment in mind as smaller organizations do not always have the type of funding a…
Stars: ✭ 33 (-56.58%)
Mutual labels:  active-directory

初学Django时碰到的一个需求,因为公司中很多员工在修改密码之后,有一些关联的客户端或网页中的旧密码没有更新,导致密码在尝试多次之后账号被锁,为了减少这种让人头疼的重置解锁密码的操蛋工作,自己做了一个自助修改小平台。

水平有限,代码写得不好,但是能用,有需要的可以直接拿去用。

场景说明:

因为本公司AD是早期已经在用,用户的个人信息不是十分全面,例如:用户手机号。
钉钉是后来才开始使用,钉钉默认是使用手机号登录。 用户自行重置密码时如果通过手机号来进行钉钉与AD之间的验证就行不通了。

逻辑:

用户扫码通过之后,通过临时授权码,提取用户的userid,再通过userid断用户在本企业中是否存在。如果存在,提取钉钉/企业微信用户的邮箱,通过邮箱转成账号,将账号拿到AD中进行比对来验证账号在AD中是否存在并账号状态是激活的。满足以上条件的账号就会视为可自行重置密码。

所能接受的账号规则

无论是钉钉、微信,均是通过提取用户邮箱的前缀部分来作为关联AD的账号,所以目前的识别逻辑就需要保证邮箱的前缀和AD的登录账号是一致的。 如果您的场景不是这样,请按自己的需求修改源代码适配。

代码提交到--新分支:

djaong3

提示:

AD必须使用SSL才能修改密码(这里被坑了N久...)
自行部署下AD的证书服务,并颁发CA证书,重启服务器生效。
具体教程百度一下,有很多。

本次升级、修复,请使用最新版:

  • 升级Python版本为3.8
  • 升级Django到3.2
  • 修复用户名中使用\被转义的问题
  • 重写了dingding模块,因为dingding开发者平台接口鉴权的一些变动,之前的一些接口不能再使用,本次重写。
  • 重写了ad模块,修改账号的一些判断逻辑。
  • 重写了用户账号的格式兼容,现在用户账号可以兼容:username、DOMAIN\username、[email protected]这三种格式。
  • 优化了整体的代码逻辑,去掉一些冗余重复的代码。

2021/05/19 -- 更新:

  • 添加了企业微信支持,修改pwdselfservice/local_settings.py中的SCAN_CODE_TYPE = 'DING'或SCAN_CODE_TYPE = 'WEWORK',区分使用哪个应用扫码验证
  • 添加Reids缓存Token支持,如果不配置Redis则使用MemoryStorage缓存到内存中

Redis的安装和配置方法请自行百度,比较简单

切记Redis一定请配置密码,弱密码或没有密码的Redis如果不小心暴露到公网,极其容易导致机器被黑用来挖矿。

整体验证逻辑不变,如果需要使用其它字段关联到AD验证的,请自行修改代码。

线上环境需要的基础环境:

  • Python 3.8.9 (可自行下载源码包放到项目目录下,使用一键安装)
  • Nginx
  • Uwsgi

截图

截图1

钉钉

截图2

微信

截图11 截图11

扫码成功之后:

截图15 截图15

钉钉必要条件:

创建企业内部应用

  • 在钉钉工作台中通过“自建应用”创建应用,选择“企业内部开发”,创建H5微应用或小程序,在应用首页中获取应用的:AgentId、AppKey、AppSecret。
  • 应用需要权限:身份验证、消息通知、通讯录只读权限、手机号码信息、邮箱等个人信息、智能人事,范围是全部员工或自行选择
  • 应用安全域名和IP一定要配置,否则无法返回接口数据。

参考截图配置: 截图3

截图4

截图5

移动接入应用--登录权限:

登录中开启扫码登录,配置回调域名:“https://pwd.abc.com/callbackCheck” 其中pwd.abc.com请按自己实际域名来,并记录相关的:appId、appSecret。

参考截图配置: 截图6

企业微信必要条件:

  • 创建应用,记录下企业的CorpId,应用的ID和Secret。

参考截图: 截图7

截图8

截图9

截图10

飞书必要条件:

  • 开放平台-->创建应-->网页开启-->配置回调url

飞书接口项目地址:https://github.com/larksuite/feishu 感谢大佬,节省了不少时间。

使用脚本自动部署:

使用脚本自动快速部署,只适合Centos,其它发行版本的Linux请自行修改相关命令。

把整个项目目录上传到新的服务器上

先修改配置文件,按自己实际的配置修改项目配置文件:

修改conf/local_settings.py中的参数,按自己的实际参数修改

# ########## AD配置,修改为自己的
# AD主机,可以是IP或主机域名,例如可以是: abc.com或172.16.122.1
AD_HOST = r'修改成自己的'

# AD域控的DOMAIN名,例如:abc
AD_DOMAIN = r'修改成自己的'

# 用于登录AD做用户信息处理的账号,需要有修改用户账号密码或信息的权限。
# AD账号,例如:pwdadmin
AD_LOGIN_USER = r'修改成自己的'
# 密码
AD_LOGIN_USER_PWD = r'修改为自己的'

# BASE DN,账号的查找DN路径,例如:'DC=abc,DC=com',可以指定到OU之下,例如:'OU=RD,DC=abc,DC=com'。
BASE_DN = r'修改成自己的'

# 是否启用SSL,
# 注意:AD必须使用SSL才能修改密码(这里被坑了N久...),自行部署下AD的证书服务,并颁发CA证书,重启服务器生效。具体教程百度一下,有很多。
AD_USE_SSL = True
# 连接的端口,如果启用SSL默认是636,否则就是389
AD_CONN_PORT = 636

# 扫码验证的类型
#       钉钉 / 企业微信,自行修改
# 值是:DING /  WEWORK
SCAN_CODE_TYPE = 'DING'

# ########## 钉钉 《如果不使用钉钉扫码,可不用配置》##########
# 钉钉接口主地址,不可修改
DING_URL = r'https://oapi.dingtalk.com'

# 钉钉企业ID <CorpId>,修改为自己的
DING_CORP_ID = '修改为自己的'

# 钉钉企业内部开发,内部H5微应用或小程序,用于读取企业内部用户信息
DING_AGENT_ID = r'修改为自己的'
DING_APP_KEY = r'修改为自己的'
DING_APP_SECRET = r'修改为自己的'

# 移动应用接入 主要为了实现通过扫码拿到用户的unionid
DING_MO_APP_ID = r'修改为自己的'
DING_MO_APP_SECRET = r'修改为自己的'


# ####### 企业微信《如果不使用企业微信扫码,可不用配置》 ##########
# 企业微信的企业ID
WEWORK_CORP_ID = r'修改为自己的'
# 应用的AgentId
WEWORK_AGENT_ID = r'修改为自己的'
# 应用的Secret
WEWORK_AGNET_SECRET = r'修改为自己的'

# Redis配置
# redis的连接地址,redis://<Ip/Host>:<Port>/<数据库>
REDIS_LOCATION = r'redis://127.0.0.1:6379/1'
REDIS_PASSWORD = r'12345678'

# ##########################
# 执行:python3 ./utils/crypto.py 生成
# 可自行生成后替换
CRYPTO_KEY = b'dp8U9y7NAhCD3MoNwPzPBhBtTZ1uI_WWSdpNs6wUDgs='

# COOKIE 超时单位是秒,可不用修改
TMPID_COOKIE_AGE = 300

# 主页域名,钉钉跳转等需要指定域名,格式:pwd.abc.com。
# 如果是自定义安装,请修改成自己的域名
HOME_URL = 'PWD_SELF_SERVICE_DOMAIN'

执行部署脚本

chmod +x auto-install.sh
./auto-install.sh

等待所有安装完成。

以上配置修改完成之后,则可以通过配置的域名直接访问。

手动部署:

自行安装完python3之后,使用python3目录下的pip3进行安装依赖:

我自行安装的Python路径为/usr/local/python3

项目目录下的requestment文件里记录了所依赖的相关python模块,安装方法:

/usr/local/python3/bin/pip3 install -r requestment

等待所有模块安装完成之后进行下一步。

按自己实际的配置修改项目配置参数:

修改conf/local_settings.py中的参数,按自己的实际参数修改

# ########## AD配置,修改为自己的
# AD主机,可以是IP或主机域名,例如可以是: abc.com或172.16.122.1
AD_HOST = r'修改成自己的'

# AD域控的DOMAIN名,例如:abc
AD_DOMAIN = r'修改成自己的'

# 用于登录AD做用户信息处理的账号,需要有修改用户账号密码或信息的权限。
# AD账号,例如:pwdadmin
AD_LOGIN_USER = r'修改成自己的'
# 密码
AD_LOGIN_USER_PWD = r'修改为自己的'

# BASE DN,账号的查找DN路径,例如:'DC=abc,DC=com',可以指定到OU之下,例如:'OU=RD,DC=abc,DC=com'。
BASE_DN = r'修改成自己的'

# 是否启用SSL,
# 注意:AD必须使用SSL才能修改密码(这里被坑了N久...),自行部署下AD的证书服务,并颁发CA证书,重启服务器生效。具体教程百度一下,有很多。
AD_USE_SSL = True
# 连接的端口,如果启用SSL默认是636,否则就是389
AD_CONN_PORT = 636

# 扫码验证的类型
#       钉钉 / 企业微信,自行修改
# 值是:DING /  WEWORK
SCAN_CODE_TYPE = 'DING'

# ########## 钉钉 《如果不使用钉钉扫码,可不用配置》##########
# 钉钉接口主地址,不可修改
DING_URL = r'https://oapi.dingtalk.com'

# 钉钉企业ID <CorpId>,修改为自己的
DING_CORP_ID = '修改为自己的'

# 钉钉企业内部开发,内部H5微应用或小程序,用于读取企业内部用户信息
DING_AGENT_ID = r'修改为自己的'
DING_APP_KEY = r'修改为自己的'
DING_APP_SECRET = r'修改为自己的'

# 移动应用接入 主要为了实现通过扫码拿到用户的unionid
DING_MO_APP_ID = r'修改为自己的'
DING_MO_APP_SECRET = r'修改为自己的'


# ####### 企业微信《如果不使用企业微信扫码,可不用配置》 ##########
# 企业微信的企业ID
WEWORK_CORP_ID = r'修改为自己的'
# 应用的AgentId
WEWORK_AGENT_ID = r'修改为自己的'
# 应用的Secret
WEWORK_AGNET_SECRET = r'修改为自己的'

# Redis配置
# redis的连接地址,redis://<Ip/Host>:<Port>/<数据库>
REDIS_LOCATION = r'redis://127.0.0.1:6379/1'
REDIS_PASSWORD = r'12345678'

# ##########################
# 执行:python3 ./utils/crypto.py 生成
# 可自行生成后替换
CRYPTO_KEY = b'dp8U9y7NAhCD3MoNwPzPBhBtTZ1uI_WWSdpNs6wUDgs='

# COOKIE 超时单位是秒,可不用修改
TMPID_COOKIE_AGE = 300

# 主页域名,钉钉跳转等需要指定域名,格式:pwd.abc.com。
# 如果是自定义安装,请修改成自己的域名
HOME_URL = 'PWD_SELF_SERVICE_DOMAIN'

安装完依赖后,直接执行 /usr/local/python3/bin/python3 manager.py runserver x.x.x.x:8000 即可临时访问项目,线上不适用这种方法,线上环境请使用uwsgi。

修改uwsig.ini配置:

IP和路径按自己实际路径修改

[uwsgi]
http-socket = PWD_SELF_SERVICE_IP:PWD_SELF_SERVICE_PORT

chdir = PWD_SELF_SERVICE_HOME
 
module = pwdselfservice.wsgi:application

master = true
 
processes = 4
 
threads = 4
 
max-requests = 2000
 
chmod-socket = 755
 
vacuum = true

#设置缓冲
post-buffering = 4096

#设置静态文件
static-map = /static=PWD_SELF_SERVICE_HOME/static

#设置日志目录
daemonize = PWD_SELF_SERVICE_HOME/log/uwsgi.log

通过uwsgiserver启动:

其中PWD_SELF_SERVICE_HOME是你自己的服务器当前项目的目录,请自行修改 将以下脚本修改完之后,复制到/etc/init.d/,给予执行权限。 uwsgiserver:

#!/bin/sh

INI="PWD_SELF_SERVICE_HOME/uwsgi.ini"
UWSGI="/usr/share/python-3.6.9/bin/uwsgi"
PSID=`ps aux | grep "uwsgi"| grep -v "grep" | wc -l`

if [ ! -n "$1" ]
then
    content="Usages: sh uwsgiserver [start|stop|restart]"
    echo -e "\033[31m $content \033[0m"
    exit 0
fi

if [ $1 = start ]
then
    if [ `eval $PSID` -gt 4 ]
    then
        content="uwsgi is running!"
        echo -e "\033[32m $content \033[0m"
        exit 0
    else
        $UWSGI $INI
        content="Start uwsgi service [OK]"
        echo -e "\033[32m $content \033[0m"
    fi

elif [ $1 = stop ];then
    if [ `eval $PSID` -gt 4 ];then
        killall -9 uwsgi
    fi
    content="Stop uwsgi service [OK]"
    echo -e "\033[32m $content \033[0m"
elif [ $1 = restart ];then
    if [ `eval $PSID` -gt 4 ];then
        killall -9 uwsgi
    fi
    $UWSGI --ini $INI
    content="Restart uwsgi service [OK]"
    echo -e "\033[32m $content \033[0m"

else
    content="Usages: sh uwsgiserver [start|stop|restart]"
    echo -e "\033[31m $content \033[0m"
fi

脚本内的路径按自己实际情况修改

自行部署Nginx,然后添加Nginx配置

Nginx配置:

Nginx Server配置:

  • proxy_pass的IP地址改成自己的服务器IP
  • 配置可自己写一个vhost或直接加在nginx.conf中
server {
    listen  80;
    server_name pwd.abc.com;

    location / {
        proxy_pass         http://192.168.x.x:8000;
        proxy_set_header   Host              $host;
        proxy_set_header   X-Real-IP         $remote_addr;
        proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }
	access_log  off;
}
  • 执行Nginx reload操作,重新加载配置
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].