Apple 在 macOS Monterey 和 iOS 15 中引入了隐私保护措施,这些措施使用随机分配的 IP 网络在加载(除其他外)电子邮件内容时充当代理。有谁知道,或者知道我怎样才能知道这些服务的网络范围是多少?
Synchro's questions
我想为图像提供缩略图,这些缩略图是按需生成的,写入磁盘,然后我想将它们交给 nginx 服务。
我的缩略图根文件夹是/var/www/images
. 当我收到请求时/thumb/post1/image1.jpg
,我想像这样处理它:
- 如果图像存在于 中
/var/www/images/thumb/post1/image1.jpg
,请直接提供。 - 如果图像不存在,则需要生成,因此将请求传递给位于 的 API
@backend
。 - API 生成图像并将其写入缩略图文件夹,然后使用标头将其路径返回给 nginx
X-Accel-Redirect
。 - nginx 在步骤 1 重新开始处理,这将成功,因为文件现在存在。
- 如果请求 thumb 的项目不存在,API 将返回 404,并且 nginx 应该提供位于的占位符图像
/var/www/images/missing.png
。
我的 nginx 配置如下所示:
upstream api {
server localhost:7440 fail_timeout=0;
}
server {
root /var/www/www.example.com/public;
location / {
try_files $uri @backend;
}
location /thumb {
root /var/www/images;
try_files $uri @backend /missing.png;
}
location @backend {
root /var/www/api.example.com/public;
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;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_redirect off;
proxy_pass http://api;
#For websocket compatibility
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
我的缩略图保存在项目文件夹之外,因此我需要在该位置添加一个root
指令/thumb
以使其在该位置查找图像。该/
位置处理 API 请求和其他静态资产,并且该/thumb
位置执行相同的操作,但也具有回退到missing.png
.
一个怪癖:由于历史原因,我的整个root
文件夹与我的@backend
命名位置使用的文件夹不同,但是,我在两个location
指令中都覆盖了它,并且没有顶级try_files
.
但是,这不起作用。丢失图像的请求不会发送到 API,但丢失图像的后备会发送!如果我删除回退,请求确实会发送到 API,但是切换x-accel-redirect
失败,即使文件现在存在;当拇指图像确实存在时,nginx 不会提供它——它只是再次访问 API。
这应该如何配置?
我需要做很多本地电子邮件测试(在 macOS 10.14 上),所以我在端口 2500 上使用了一个假的 SMTP 服务器来处理大多数事情,但是,我还需要捕获通过本地sendmail
二进制文件直接发送的消息,这实际上意味着使用真正的邮件服务器,可以将它们中继到我的假邮件服务器。我正在尝试为此使用后缀,但它确实进展不顺利。我的目标是让它为所有域中的所有用户中继所有消息,而不进行过滤、加密或身份验证。我根本不希望它关注本地用户帐户,这似乎需要禁用本地 postfix 传递代理,我还没有找到如何做到这一点。
我的配置主要归结为:
local_transport = local:$myhostname
mydestination = $myhostname, localhost.$mydomain, localhost
local_recipient_maps =
relayhost = localhost:2500
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/local_passwd
smtp_use_tls = no
smtp_tls_security_level = none
compatibility_level = 2
fallback_transport = localhost:2500
我的假邮件服务器需要身份验证,尽管它不检查任何内容并且任何用户名或密码都可以使用,因此该local_passwd
文件中有一个虚拟条目。
在 macOS 上查看日志非常痛苦;到目前为止我发现的最好的方法是:
sudo log stream --predicate '(process == "cleanup") || (process == "pickup") || (process == "qmgr") || (process == "error")' --info
当我使用 sendmail 直接向它提交消息时,我可以看到它很乐意接受本地帐户的消息,但它不会转发它们。它还拒绝发送到不存在的帐户的消息,就像[email protected]
我希望它接受和中继一样。
消息最终会在我运行时可以到达的某个邮箱中mail
。
我错过了什么?
这是对这个问题的跟进。
我有一个配置一堆 EC2 实例的游戏。必要时,该hosts
值是localhost
(因为当它运行时没有主机),并且该播放组装了一个名为的新主机列表ec2hosts
,并生成主机 ip 到主机名映射,因为这是第一次也是唯一一次提供该信息,并且使用set_fact
. 这个主机列表是后续游戏的主题。问题是我需要hostname_map
在第二次播放中使用在配置播放期间创建的字典,而我看不到如何执行此操作。
这是第一部戏:
- hosts: localhost
connection: local
gather_facts: False
tasks:
- name: Provision a set of instances
ec2:
key_name: marcus
instance_type: t2.micro
image: "{{ ami_id }}"
wait: true
exact_count: "{{ server_count }}"
count_tag:
Tutorial: "{{ tutorial_name }}"
instance_tags:
Tutorial: "{{ tutorial_name }}"
groups: ['SSH', 'Web']
register: ec2
- name: Add all instance public IPs to host group
add_host:
hostname: "{{ item.public_ip }}"
groups: ec2hosts
loop: "{{ ec2.instances }}"
- name: Build an IP to hostname map
set_fact:
hostname_map: "{{ hostname_map | combine({item.0.public_ip: (item.1 + '.' + tutorial_domain)}) }}"
loop: "{{ ec2.instances|zip(hostnames)|list }}"
- name: Debug hostname_map
debug:
msg: "{{ hostname_map }}"
最后,hostname_map
包含如下地图:
{
"18.184.109.70": "host1.example.com",
"18.196.135.59": "host2.example.com"
}
通过阅读关于变量范围的 ansible 文档,它说在剧本中定义的变量在该剧本之外不可用,除非它被应用于同一组主机。在这种情况下这是不可能的,所以我需要使用具有全局范围的 var,从我读过的内容set_fact
来看,这是执行此操作的适当方法。所以我在 中创建了一个空变量/group_vars/all
,以便所有播放都可以访问该变量:
hostname_map: {}
下一个播放连接到每个新创建的实例(使用我们动态创建的主机列表)并从内部设置其主机名:
- hosts: ec2hosts
gather_facts: yes
tasks:
- name: Debug hostname_map
debug:
msg: "{{ hostname_map }}"
- name: Set hostnames
hostname:
name: "{{ hostname_map[ansible_host] }}"
但是,这失败了,因为hostname_map
它是空的
TASK [Debug hostname_map]
ok: [18.184.109.70] => {
"msg": {}
}
ok: [18.196.135.59] => {
"msg": {}
}
所以我得到这个错误:
致命:[18.184.109.70]:失败!=> {“msg”:“任务包含一个带有未定义变量的选项。错误是:'dict object'没有属性u'18.184.109.70'
奇怪的是,即使我没有全局定义变量,我也会得到相同的调试输出和错误。
我读过的其他文章都建议应该在 中明确枚举值vars
,但我不能这样做,因为数据是动态的,直到运行时才知道。同样,出于同样的原因,我无法extra_vars
在命令行上使用它。
如何在第二次播放中使此变量可用?我想避免笨拙的解决方案,例如将本地文件写出然后再将其读回!
我也愿意接受以完全不同的方式执行此操作的建议,其中“this”是:创建任意数量的 EC2 实例并为它们分配从静态列表中获取的主机名。
我正在为动手教程会话设置一组多达 150 个临时 EC2 服务器。
我正在成功地动态创建 EC2 清单并针对为配置所有内容而创建的实例运行角色,但我需要为每个实例设置一个简单的主机名。为此,我有一个文件,其中包含我想用于主机名的简单名称列表。这是在我的剧本中:
---
- hosts: localhost
connection: local
gather_facts: false
tasks:
- name: Provision a set of instances
ec2:
key_name: ubuntu
instance_type: t2.micro
image: "{{ ami_id }}"
wait: true
exact_count: {{ server_count }}
count_tag:
Name: Tutorial
instance_tags:
Name: Tutorial
groups: ['SSH', 'Web']
register: ec2
- name: Add all instance public IPs to host group
add_host: hostname={{ item.public_ip }} groups=ec2hosts
loop: "{{ ec2.instances }}"
- name: Set a host name for each instance in DNS
route53:
zone: {{ tutorial_domain }}
record: "name.{{ tutorial_domain }}"
state: present
type: A
ttl: 120
value: {{ item.public_ip }}
wait: yes
loop: "{{ ec2.instances }}"
它真的归结为那一record: "name.{{ tutorial_domain }}"
行 - 我如何在我的名字列表中查找一个名字并将其用作主机名,name
变成{{ some_dynamic_name }}
?
我已经看过查找插件,但它们似乎都专注于循环某个外部文件的全部内容 - 但我已经循环了服务器列表,并且该列表可能比名称列表短(例如我可能只有 10 台服务器)。理想情况下,我想一次将名称列表读入一个数组,然后使用服务器循环中的索引来选择名称(即,第三台服务器将获得第三个名称)。我如何在ansible中做到这一点?还是有更好的方法?
证书颁发机构授权 (CAA) DNS 记录类型包括一个issue
参数 (also issuewild
),该参数指定允许为您的域颁发证书的证书颁发机构的标识符。没关系,但有点模糊。
在您自己的 CAA 记录中设置值时,您应该如何找出您的 CA 的确切值应该是什么?对于letsencrypt,他们在此处提供了一个文档,其中提到他们的问题标识符是letsencrypt.org
,并且它也记录在他们的认证实践声明第4.2.1节中。如果我检查证书,我可以看到其中的各个字段,但是,没有一个与此字符串完全匹配,尽管有些字段包含它。这似乎不是确保 CA 与 CAA 记录中的内容相匹配的严格或可靠的方法——例如,是什么阻止了它被匹配letsencrypt.org.evilcorp.com
?
从人类的角度来看,这一切都是可行的,但不是很机器可读,并且是这个 CA 独有的。
我也有来自 Comodo 的证书,并且我发现各种非权威来源说他们的 CAA 问题 id 是comodoca.com
(而其他人说它是comodo.com
),但我还没有找到像 letencrypt 这样的官方文档。该comodoca.com
字符串确实出现在我的证书的某些字段中,但不是在我希望可靠地找到它的上下文中 - 例如颁发者名称是COMODO ECC Domain Validation Secure Server CA (COMODO CA Limited from GB)
,CRL 是http://crl.comodoca.com/COMODOECCDomainValidationSecureServerCA.crl
,OCSP URI 是http://ocsp.comodoca.com
。
SSLMate 有一个CAA 记录生成器,它包括一个 CA 列表及其颁发者 ID——但这些信息是从哪里获得的?
现在考虑验证案例——给定一个证书和一个或多个 CAA 颁发者 ID,我们应该期望证书中的哪些元素与 CAA 颁发者完全匹配?还是从其他服务(如 CT 日志)获得的信息?
所以,简而言之,应该从哪里获得 CAA 颁发者 ID,以及如何可靠地验证它们?
我有一个 nginx 配置,其中包含一个为所有请求提供服务的 CSP 标头。现在我需要在一个特定位置覆盖它(这也恰好被重写)。我在想这样的事情:
server {
listen 80;
listen [::]:80;
server_name example.com;
root /var/www;
index index.php;
try_files $uri @rewrites;
add_header Content-Security-Policy "default-src 'self' ; script-src 'self' ; style-src 'self' 'unsafe-inline' ; img-src * 'self' data: ; font-src 'self' ; media-src * 'self' ; form-action 'self'";
location @rewrites {
rewrite ^/special/([0-9]*) /special.php?id=$1 last;
rewrite ^/foo/([a-z]+) /foo.php?method=$1 last;
}
location /special {
add_header Content-Security-Policy "default-src 'self' ; script-src 'self' 'unsafe-inline' ; style-src 'self' 'unsafe-inline' ; img-src * 'self' data: ; font-src 'self' ; media-src * 'self' ; form-action 'self'";
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
include fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass php;
}
}
但是,虽然这会在任何以 开头的请求上设置标头/special
,但它会导致 404,因为它不会继续到映射 PHP 文件的以下位置。我该怎么做?
我试图让一些非常基本的东西在 OS X 上使用 Ansible 2.1.1.0。
我的目标都是 Ubuntu 16.04,所以我要做的第一件事就是让它安装 python2.7,因为没有它,即使“ping”也不起作用。
我在以下位置设置了这样的库存servers
:
[dbservers]
192.168.x.x set_hostname=db
[webservers]
[servers:children]
dbservers
webservers
这是我的游戏init.yml
:
---
- hosts: servers
gather_facts: False
become: yes
tasks:
- name: apt-get update
raw: /usr/bin/apt-get update -qq
- name: Install python 2.7
raw: test -e /usr/bin/python || /usr/bin/apt-get install -q -y python2.7 python-simplejson
dbservers
我通过指定组来检查它是否选择了正确的主机,该组是servers
(无论如何只有 1 个)的子集,这对我来说看起来正确:
# ansible dbservers -i servers --list-hosts
hosts (1):
192.168.x.x
我正在运行的命令是这样的:
# ansible dbservers -i servers init.yml
那是我得到错误的时候ERROR! Missing target hosts
。我不明白它如何同时拥有主机和没有主机!我究竟做错了什么?
Perfect Forward Secrecy是 SSL/TLS 通信的一项重要增强功能,即使攻击者拥有私钥,也有助于防止捕获的 SSL 流量被解密。在 Web 服务器中支持它很容易,但它也适用于任何其他 SSL 上下文,例如在用于 SMTP、POP3 和 IMAP 的邮件服务器中。
这最近(2014 年 9 月)在德国达到顶峰,那里的数据保护机构已经开始检查和罚款不支持其邮件服务器上的 PFS 的组织,以及 heartbleed 和 poodle 漏洞。Web 浏览器中的 PFS 支持有些不完整,尽管所有主要浏览器都支持它 - 但我正在寻找有关邮件服务器和客户端的 PFS 兼容性信息,理想情况下是SSL Labs的握手测试提供的信息,但适用于邮件服务器。
任何人都可以提供或指出邮件服务器 PFS 兼容性的良好来源吗?
澄清一下,我不是要询问特定的服务器,而是要查看跨各种不同服务器的此类测试的结果,例如,知道 Outlook 2003 不支持 ECDHE 或 Android 2 不允许大于 2048 位的 DH 参数(我不知道这些是否属实,它们只是示例)。这样做的好处是知道如果我选择禁用某些特定密码,它可能会影响哪些客户端,就像 SSL 实验室测试显示的 Web 客户端一样。
我有一个带有正则表达式匹配的 nginx 服务器定义,如下所示:
server_name ~^(?<vhost>[a-z0-9-]+)\.example\.com$;
root /var/www/example/$vhost;
access_log /var/log/nginx/$vhost.example-access.log;
这一切都很好,但是,这个域使用 fastcgi 和 PHP-FPM 托管各种 PHP 项目,它们在以下位置接收如下值$_SERVER
:
SERVER_NAME => "~^(?<vhost>[a-z0-9-]+)\.example\.com$"
HTTP_HOST => "myhost.example.com"
如您所见,正则表达式模式被放入SERVER_NAME
而不是它匹配的字符串中。这对我来说似乎有点错误,并且也代表了安全风险,因为它揭示了不必要的细节(在其他配置中,我匹配的是一组特定的名称而不是通配符)。
您可能会说“使用 HTTP_HOST 而不是 SERVER_NAME” - 如果只是这么简单的话 - 有些库希望 SERVER_NAME (毫不奇怪)包含服务器的名称。我真的看不出这种行为的好用例。
我已经看到了在 nginx 上处理双栈 IPv4 和 IPv6 虚拟主机的各种配置示例。许多人建议这种模式:
listen 80;
listen [::]:80 ipv6only=on;
据我所知,这实现了完全相同的事情:
listen [::]:80 ipv6only=off;
为什么要使用前者?我能想到的唯一原因是您是否需要特定于每个协议的附加参数,例如,如果您只想deferred
在 IPv4 上设置。
我正在设置一个临时的 haproxy 实例来帮助测试 iPhone 应用程序的新后端。我的计划不是使用专门制作的应用程序或越狱,而是设置一个所有电话数据都将通过的代理,但让它与主机标头匹配并将它们转发到尚未启用的新服务器。简而言之,除了某些特定主机名之外,我希望 haproxy 像一个开放代理一样工作。匹配主机名并转发它们工作得很好,但我似乎无法使开放代理位工作。我在 Ubuntu Precise 上使用 stock haproxy 1.4.18 包,具有 stock 全局设置,加上这些代理设置:
frontend myapp
bind 0.0.0.0:8080
default_backend passthrough
acl mydomain hdr_end(Host) .example.com
use_backend front if mydomain
backend front
server front 127.0.0.1:80
backend passthrough
server ???
所以前端位于 8080 端口,默认将请求推送到passthrough
后端。在此之前,它会检查 acl 以查看请求是否针对我域中的主机名,如果是,则将其转发到本地应用程序。
问题出在那个passthrough
后端。我希望它将请求直接传递给请求的主机,而不是本地端点。我放在那里的配置不起作用,但我不知道它应该说什么。例如,如果我请求http://www.serverfault.com
,它不会匹配我的 ACL,所以我希望它直接转发到 serverfault,而不是本地服务器。我不确定哪个指令会在后端执行此操作,或者是否有一些前端指令会执行此操作。就代理而言,它或多或少是一个空操作。
(是的,我知道开放代理不好;这是一个临时测试配置,一次只能交互运行几分钟)
更新:我发现option http_proxy
它完全符合我的需要,除了它不进行 DNS 查找,只进行显式 IP,所以像这样的后端几乎就在那里:
backend passthrough
option http_proxy
option httpclose
我知道我可能可以使用其他东西,但我恰好真的很喜欢 haproxy!
我有两个网站,我在 Ubuntu 12.04 上使用 PHP-FPM 5.4 从 apache 2.2 虚拟主机运行。到目前为止,我一直在使用服务器范围(库存)的 mod_fastcgi 配置,但现在我想将其分成两个 FPM 池,以便我可以为每个池使用不同的 PHP 设置(例如,一个是开发站点,因此启用了错误显示).
根据文档,我设置了两个具有不同名称和套接字位置的 FPM 池,禁用了全局 fastcgi 配置,将其复制到我的虚拟主机中并将其更改为指向每个虚拟主机的不同池,如下所示:
<IfModule mod_fastcgi.c>
<FilesMatch \.php$>
SetHandler php-script
</FilesMatch>
Action php-script /php5.fcgi virtual
Alias /php5.fcgi /var/fastcgi/php5.fcgi
FastCGIExternalServer /var/fastcgi/php5.fcgi -socket /var/run/php5-fpm-www.sock
<Directory "/var/fastcgi">
Order allow,deny
<Files "php5.fcgi">
Order deny,allow
Deny from all
Allow from env=REDIRECT_STATUS
</Files>
</Directory>
</IfModule>
实际上有 4 个虚拟主机,因为每个主机名都有常规和 SSL 风格,每一对指向一个 FPM 池。
我遇到的问题是 apache 抛出一个错误说:
FastCgiExternalServer: redefinition of previously defined class "/var/fastcgi/php5.fcgi"
应该怎么做?