前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Exchange2010接收发送连接器的安全权限

Exchange2010接收发送连接器的安全权限

作者头像
孤鸿
发布于 2022-09-23 08:56:56
发布于 2022-09-23 08:56:56
53500
代码可运行
举报
文章被收录于专栏:孤鸿孤鸿
运行总次数:0
代码可运行

应boss要求,需要关掉邮箱服务器的匿名登录发邮件的权限,下面共享一下该问题的深入知识。

下面我们来查看匿名用户的权限

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[PS] C:\Get-ReceiveConnector mailserver\D* | Get-ADPermission | where {$_.user -like "*anon*"} | ft identity,user,deny,extendedrighsts –autosize

你会发现,匿名用户是没有验证用户的smtp提交权限的。 下面我们来看看接收器上针对用户的几个权限(也就是extenderights):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Permission    Display name
ms-Exch-SMTP-Submit    Submit Messages to Server
ms-Exch-SMTP-Accept-Any-Recipient    Submit Messages to any Recipient
ms-Exch-SMTP-Accept-Any-Sender    Accept any Sender
ms-Exch-SMTP-Accept-Authoritative-DomainSender    Accept Authoritative Domain Sender
ms-Exch-SMTP-Accept-Authentication-Flag    Accept Authentication Flag
ms-Exch-Accept-Headers-Routing    Accept Routing Headers
ms-Exch-Accept-Headers-Organization    Accept Organization Headers
ms-Exch-Accept-Headers-Forest    Accept Forest Headers
ms-Exch-SMTP-Accept-Exch50    Accept Exch50
ms-Exch-SMTP-Send-Exch50    Send Exch50
ms-Exch-Send-Headers-Routing    Send Routing Headers
ms-Exch-Send-Headers-Organization    Send Organization Headers
ms-Exch-Send-Headers-Forest    Send Forest Headers
ms-Exch-Bypass-Message-Size-Limit    Bypass Message Size Limit
ms-Exch-Bypass-Anti-Spam    Bypass Anti-Spam

参数解释

ms-Exch-SMTP-Submit

如果smtp接收线程没有该权限,线程是无法通过该连接器提交邮件的。使用“mail from”;”auth”命令都会失败。这也意味着你的exchangeserver无法通过该连接器拿到发给该域内的邮件。 为匿名添加该权限:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Get-ReceiveConnector mailserver\\D\* | Add-ADPermission –user “nt authority\\anonymous logon” –extendedrights ms-exch-smtp-submit

再次测试,此时报的是另外一个错误,是正常的

ms-Exch-SMTP-Accept-Any-Sender

上面的错误是因为匿名登陆没有ms-Exch-SMTP-Accept-Any-Sender permission。如果smtp接收线程没有该权限,服务器将会检查发信人地址仿冒。 为匿名添加该权限:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Get-ReceiveConnector mailserver\D* | Add-ADPermission –user “nt authority\anonymous logon” –extendedrights ms-exch-smtp-accept-any-sender

再次测试,ok了

在上面的测试中,我突然想使用另外一个账户名来发送邮件,但是如你看到的,我失败了。可是匿名用户不是拥有可以使用任意域名的权限么?为什么?原 来,Exchange Receive Connectors有2个不同的权限针对mail from 判断使用可以允许的域名。这些域名有2大类:

权威域和internal relay
extenal relay或者没有定义

如何查看exchange organization中哪些域名是被设置为权威域? 使用 get-acceptedDoamin

你可以看到 “bb.dmn” 是一个权威域;这也就是为何无法使用该域名发信的原因。如果要让receive connector接受这种类型的发送者SMTP线程,则必须添加ms-Exch-SMTP-Accept-Authoritative-Domain-Sender 权限

ms-Exch-SMTP-Accept-Authoritative-Domain-Sender 如果smtp接收线程没有该权限,服务器会拒绝“mailfrom”中使用了权威域名的邮件。 为匿名账户添加该权限

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Get-ReceiveConnector mailserver\D* | Add-ADPermission –user “nt authority\anonymous logon” –extendedrights ms-Exch-SMTP-Accept-Authoritative-Domain-Sender

再次测试,没有问题了吧!

看起来是没有问题了。SMTP 线程可以接受任意的mailfrom地址;发送者也可以使用任意域名,而且还能使用权威域名。SMTP线程也接受收件人是权威域内的用户,但拒绝投递邮件 给外部。这确保了邮件系统是安全的,不会被外部用户relay. So what permission is missing from SMTP session so that we couldn’t relay message to outside. Check out the next one please!!

ms-Exch-SMTP-Accept-Any-Recipient

这是一个重要的权限,你也可以称之为relay权限。因为一个拥有该权限的smtp接收线程可以投递邮件给组织外。如果你有一个面向公网的接受连接器而且为匿名用户添加了该权限,那此时你的邮件系统就是一个 OPEN-RELAY server!!

作为测试的目的,我们这里为匿名用户添加该权限。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Get-ReceiveConnector mailserver\D* | Add-ADPermission –user “nt authority\anonymous logon” –extendedrights ms-Exch-SMTP-Accept-Any-Recipient

此时再来做测试:

这就是一个open relay smtp server了。别怪我没有提醒你!如果你这么干了,后果自负!

ms-Exch-SMTP-Accept-Authentication-Flag

如果smtp接收线程没有该权限,服务器将会忽略auth验证的部分。在内网中,exchangeservers传送匿名邮件会使用“auth=<>”。

这个权限允许早前版本的exchange服务器以内部发送者的名义提交邮件。Ex07 会将这些邮件识别为内部邮件。(exchange07的邮件全部有hub来投递,所以比如ex03就不能归属于exchange07 的组织中。)

ms-Exch-Accept-Headers-Routing

如果smtp接收线程没有该权限,服务器会删掉所有“received:”的行

如果你查看入站邮件头,你可以看到邮件从发送者到收信者所经过的邮件服务器信息。下面是在outlook中使用Message Options 查看的例子。当邮件从SMTP server传递给下一个server,每个接受server都会在mail中添加一个签名(以Received:开头)。如果一个邮件在组织内经过了3 个smtp服务器,那这封邮件的接受者就能知道你组织的内网中3台mialserver的ip地址。是不是觉得很不安全呢?

要避免该问题,你只需要简单的在发送接收器上拒绝匿名用户的这项权利。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
get- sendconnector “D*| add-adpermission –user “nt authority\anonymous logon” –extendedrights ms-Exch-Accept-Headers-Routing
Get-SendConnector "d*"| Get-ADPermission -user "nt authority\anonymous logon" | ft deny,isinherited,extendedrights -autosize

ms-Exch-Accept-Headers-Organization

如果smtp接收线程没有该权限,服务器会删掉所有“X-MS-Exchange-Organization-”的行

ms-Exch-Accept-Headers-Forest

如果smtp接收线程没有该权限,服务器会删掉所有“X-MS-Exchange-Forest-”的行

ms-Exch-SMTP-Accept-Exch50

这个权限允许线程提交包含XEXCH50命令的邮件。当于Exchange 2000 Server 和 Exchange 2003协同工作的时候会用到XEXCH50命令。而在exchange07only的状态下,该权限应该被disabled。

ms-Exch-Send-Headers-Routing

如果smtp发送线程没有该权限,服务器会删掉所有“received:”的行。

ms-Exch-Send-Headers-Organization

如果smtp发送线程没有该权限,服务器会删掉所有“X-MS-Exchange-Organization-”的行

ms-Exch-Send-Headers-Forest

如果smtp发送线程没有该权限,服务器会删掉所有“X-MS-Exchange-Forest-”的行

ms-Exch-Bypass-Message-Size-Limit

如果SMTP接收线程拥有该权限,服务器将在协议级别跳过邮件大小限制。

ms-Exch-Bypass-Anti-Spam

如果SMTP接收线程拥有该权限,服务器将跳过该邮件的anti-spampass检查。

PS:除了可以通过powershell更改以上权限外,还可以在域控上通过ADSI工具修改,在后面的文章里面描述。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
面试官:为什么重写 equals 同时要重写 hashCode? 我:…
重写equals是为了在业务逻辑上判断实例之间是否相等。重写hascode是为了让集合快速判重。
终码一生
2022/04/14
2850
引以为戒:避免在Set中使用未重写equals和hashCode的引用对象进行去重
在日常的Java开发中,我们经常会使用Set集合来实现去重操作,确保集合中不含有重复的元素。然而,如果使用未重写equals()和hashCode()方法的引用对象进行去重,可能会导致意外的行为,最近了在项目中就遇到了这个情况,让我们深入探讨这个问题,并引以为戒,确保正确实现去重操作。
修己xj
2023/08/25
4060
引以为戒:避免在Set中使用未重写equals和hashCode的引用对象进行去重
面试点:Java 中 hashCode() 和 equals() 的关系
Java 中 hashCode() 和 equals() 的关系是面试中的常考点,如果没有深入思考过两者设计的初衷,这个问题将很难回答。除了应付面试,理解二者的关系更有助于我们写出高质量且准确的代码。
TimeFriends
2022/09/05
5850
面试题系列第4篇:重写了equals方法,为什么还要重写hashCode方法?
这不仅仅是一道面试题,而且是关系到我们的代码是否健壮和正确的问题。在前面两篇文章涉及到了equals方法的底层讲解:《说说==和equals的区别?你的回答可能是错误的》和《Integer等号判断的内幕,你可能不知道?》。
程序新视界
2020/08/31
1.6K1
面试题系列第4篇:重写了equals方法,为什么还要重写hashCode方法?
HashSet的add()方法源码解析(jdk1.8)
因为通常声明map集合时不会指定大小,或者初始化的时候就创建一个容量很大的map对象,所以这个通过容量大小与key值进行hash的算法在开始的时候只会对低位进行计算,虽然容量的2进制高位一开始都是0,但是key的2进制高位通常是有值的,因此先在hash方法中将key的hashCode右移16位在与自身异或,使得高位也可以参与hash,更大程度上减少了碰撞率。
全栈程序员站长
2022/07/09
2450
JAVA中重写equals()方法为什么要重写hashcode()方法说明
重写hashCode()时最重要的原因就是:无论何时,对同一个对象调用hashCode()都应该生成同样的值。如果在将一个对象用put()方法添加进HashMap时产生一个hashCode()值,而用get()取出时却产生了另外一个 hashCode()值,那么就无法重新取得该对象了。所以,如果你的hashCode()方法依赖于对象中易变的数据,那用户就要小心了,因为此数据发生变化时,hashCode()就会产生一个不同的hash码,相当于产生了一个不同的“键”。        Object的hashCode()方法,返回的是当前对象的内存地址。下次如果我们需要取一个一样的“键”对应的键值对的时候,我们就无法得到一样的hashCode值了。因为我们后来创建的“键”对象已经不是存入HashMap中的那个内存地址的对象了。        我们看一个简单的例子,就能更加清楚的理解上面的意思。假定我们写了一个类:Person (人),我们判断一个对象“人”是否指向同一个人,只要知道这个人的身份证号一直就可以了。        先来个没有重写Code类的hashcode()的例子吧,看看是什么效果:
bear_fish
2018/09/20
1.1K0
JAVA中重写equals()方法为什么要重写hashcode()方法说明
HashMap源码分析
负载因子,当size大于threshold时进行扩容,threshold=capacity * loadFactor,capacity是当前数组长度,若当前桶大小为16,16*0.75=12,那么当哈希表中的存储的键值对数达到扩容阈值12时扩容,扩容为原来的2倍
Krains
2020/08/19
2830
HashMap源码分析
equals() ? ==? hashCode()? 今天就把你们都认识清楚
byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),基础数据类型比较的是他们的值。
Java宝典
2021/04/22
4520
这可能是最细的HashMap详解了!
# 手撕HashMap源码 > 文章已同步至GitHub开源项目: [Java超神之路](https://github.com/shaoxiongdu/java-notes) ### HashMap一直是面试的重点。今天我们来了解了解它的源码吧! > 首先看一下Map的继承结构图 ![image-20210906151448379](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210906151448379.png) > 源码
程序员阿杜
2021/09/11
2520
HashMap详解
**Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值。**这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
程序员阿杜
2023/08/25
2710
程序猿的日常——HashMap的相关知识
背景知识 哈希冲突 哈希是指通过某种方法把数据转变成特定的数值,数值根据mod对应到不同的单元上。比如在Java中,字符串就是通过每个字符的编码来计算、数字是本身对应的值等等,不过就算是再好的哈希方法
用户1154259
2018/01/17
4300
程序猿的日常——HashMap的相关知识
HashSet 如何保证元素不重复——hash码
HashSet 不重复主要add 方法实现,使用 add 方法找到是否存在元素,存在就不添加,不存在就添加。HashSet 主要是基于HashMap 实现的,HashMap 的key就是 HashSet 的元素,HashSet 基于hash 函数实现元素不重复。首先看 add 方法:
用户10384376
2023/02/25
2250
HashSet 如何保证元素不重复——hash码
java为什么要重写hashCode和equals方法
      在我们的业务系统中判断对象时有时候需要的不是一种严格意义上的相等,而是一种业务上的对象相等。在这种情况下,原生的equals方法就不能满足我们的需求了。
业余草
2019/01/21
2.9K0
分析 JDK 源码丨Java HashMap
HashMap 是数组和链表组合组成的复杂结构,哈希值决定了键值在数组的位置,当哈希值相同时则以链表形式存储,当链表长度到达设定的阈值则会对其进行树化,这样做是为了保证数据安全和数据相关操作的效率
码脑
2019/10/29
3780
分析 JDK 源码丨Java HashMap
HashMap深度解析(一)
高爽
2017/12/28
7760
HashMap深度解析(一)
HashMap框架源码深入解读,面试不用愁
在Java Collections Framework的体系中中,主要有两个重要的接口,一个是List、Set和Queue所属的Collection,还有一个就是Map接口了。在上一篇文章中介绍了List接口,它适用于按数值索引访问元素的情形。本文中将介绍的Map则提供了一个更通用的元素存储方法。
李红
2019/09/05
3710
Java中Set集合是如何实现添加元素保证不重复的?
Java中Set集合是如何实现添加元素保证不重复的? Set集合是一个无序的不可以重复的集合。今天来看一下为什么不可以重复。 Set是一个接口,最常用的实现类就是HashSet,今天我们就拿HashSet为例。 先简单介绍一下HashSet类 HashSet类实现了Set接口, 其底层其实是包装了一个HashMap去实现的。HashSet采用HashCode算法来存取集合中的元素,因此具有比较好的读取和查找性能。 先看下HashSet的几个构造方法。 // 默认构造函数 底层创建一个HashMap
武培轩
2018/04/17
1.5K0
【重点,要考的】数据结构及算法基础--哈希图(HashMap)
在了解HashMap前我们要先了解Object的两个方法:Equals和hashCode()
用户5640963
2019/07/26
3840
深入Java源码剖析之Set集合
HashSet实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。看下面的一个例子:
wangweijun
2020/02/14
5050
了解HashMap数据结构,超详细!
HashMap基于哈希表的Map接口实现,是以key-value存储形式存在,即主要用来存放键值对。HashMap的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null。此外,HashMap中的映射不是有序的。
程序员的时光001
2020/11/02
5930
了解HashMap数据结构,超详细!
推荐阅读
相关推荐
面试官:为什么重写 equals 同时要重写 hashCode? 我:…
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文