#29752 Adding a ALLOWED_HOSTS_IGNORABLE_URLS setting

145 views
Skip to first unread message

Jonas H

unread,
Sep 14, 2018, 11:52:46 AM9/14/18
to Django developers (Contributions to Django itself)
Hi,

I've started a discussion on https://code.djangoproject.com/ticket/29752 to add a new ALLOWED_HOSTS_IGNORABLE_URLS setting.

The setting can become handy if you can't control the Host header sent to your application but still want to accept the request. An example of this is health checks made by AWS ECS/Fargate – google "django allowed_hosts aws" and find 16,000 results with tips how to work around the problem.

I'd like to discuss the addition on this list as per Tim's triage.

Jonas

Tim Graham

unread,
Sep 14, 2018, 1:44:10 PM9/14/18
to Django developers (Contributions to Django itself)
What would be the value of that setting for your use case?

Matt Pegler

unread,
Sep 14, 2018, 2:03:11 PM9/14/18
to django-d...@googlegroups.com
We would find this valuable for the reason Jonas outlined. Health checks from AWS are sent without a host header, which causes the request to fail the host check. By whitelisting the health check path, it would simplify deployments to AWS and possibly others. Here's the workaround we use in production to support AWS health checks that may help give some more context: http://dpaste.com/2BS0C5M

-Matt

--
You received this message because you are subscribed to the Google Groups "Django developers (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-developers+unsubscribe@googlegroups.com.
To post to this group, send email to django-developers@googlegroups.com.
Visit this group at https://groups.google.com/group/django-developers.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-developers/48278799-baea-4943-91b0-4d1f2318c3a5%40googlegroups.com.

For more options, visit https://groups.google.com/d/optout.

Tim Graham

unread,
Sep 14, 2018, 2:29:43 PM9/14/18
to Django developers (Contributions to Django itself)
Sorry, I still don't understand what "whitelisting the health check path" looks like.

Here's the snippet for anyone reading the thread after the pastebin expires.


ALLOWED_HOSTS
= ['ourdomain.com'] EC2_PRIVATE_IP = None try: # AWS provided magic service that returns metadata about the instance making the call EC2_PRIVATE_IP = requests.get('http://169.254.169.254/latest/meta-data/local-ipv4', timeout = 0.01).text except requests.exceptions.RequestException: pass if EC2_PRIVATE_IP: ALLOWED_HOSTS.append(EC2_PRIVATE_IP)


On Friday, September 14, 2018 at 2:03:11 PM UTC-4, Matt wrote:
We would find this valuable for the reason Jonas outlined. Health checks from AWS are sent without a host header, which causes the request to fail the host check. By whitelisting the health check path, it would simplify deployments to AWS and possibly others. Here's the workaround we use in production to support AWS health checks that may help give some more context: http://dpaste.com/2BS0C5M

-Matt
On Fri, Sep 14, 2018 at 10:44 AM, Tim Graham <timog...@gmail.com> wrote:
What would be the value of that setting for your use case?

On Friday, September 14, 2018 at 11:52:46 AM UTC-4, Jonas H wrote:
Hi,

I've started a discussion on https://code.djangoproject.com/ticket/29752 to add a new ALLOWED_HOSTS_IGNORABLE_URLS setting.

The setting can become handy if you can't control the Host header sent to your application but still want to accept the request. An example of this is health checks made by AWS ECS/Fargate – google "django allowed_hosts aws" and find 16,000 results with tips how to work around the problem.

I'd like to discuss the addition on this list as per Tim's triage.

Jonas

--
You received this message because you are subscribed to the Google Groups "Django developers (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-develop...@googlegroups.com.
To post to this group, send email to django-d...@googlegroups.com.

Matt Pegler

unread,
Sep 14, 2018, 2:55:31 PM9/14/18
to django-d...@googlegroups.com
AWS will send a request to a specific path and make sure it receives a status 200 response. If the response status is not 200, it will consider that instance unhealthy and will not route traffic to that instance. The path can be anything that can be used as a signal that the application is running properly.

-Matt

To unsubscribe from this group and stop receiving emails from it, send an email to django-developers+unsubscribe@googlegroups.com.
To post to this group, send email to django-developers@googlegroups.com.

Collin Anderson

unread,
Sep 14, 2018, 3:24:40 PM9/14/18
to django-d...@googlegroups.com
You might be able to handle this by a middleware that gets called early enough in the process (before CommonMiddleware) to avoid calling request.get_host(). A simple if request.path == '/statuscheck/': return HttpResponse() should work. As long as you never call request.get_host(), django doesn't about ALLOWED_HOSTS.

Maybe we should patch CommonMiddleware to avoid calling request.get_host() if not needed:

-Matt

--
You received this message because you are subscribed to the Google Groups "Django developers (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-develop...@googlegroups.com.
To post to this group, send email to django-d...@googlegroups.com.
Visit this group at https://groups.google.com/group/django-developers.

Mattia Procopio

unread,
Sep 14, 2018, 3:29:01 PM9/14/18
to Django developers (Contributions to Django itself)
What I usually do is rewriting the Host value at webserver level using one of the allowed when receiving healthchecks from a load balancer. This is not optimal and having a whitelist for some uris to allow requests without a valid host could make this specific thing easier

Adam Johnson

unread,
Sep 14, 2018, 5:18:37 PM9/14/18
to django-d...@googlegroups.com
The snippet Matt posted is the same technique I've used for ages, albeit using the ec2-metadata library. I think it's perfectly fine as-is, the Host header EC2 uses is actually predictable as the EC2 Private IP. I don't think Django needs another setting that disables a security feature and could be open to misconfiguration.

On Fri, 14 Sep 2018 at 20:29, Mattia Procopio <prom...@gmail.com> wrote:
What I usually do is rewriting the Host value at webserver level using one of the allowed when receiving healthchecks from a load balancer. This is not optimal and having a whitelist for some uris to allow requests without a valid host could make this specific thing easier

--
You received this message because you are subscribed to the Google Groups "Django developers  (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-develop...@googlegroups.com.
To post to this group, send email to django-d...@googlegroups.com.
Visit this group at https://groups.google.com/group/django-developers.

For more options, visit https://groups.google.com/d/optout.


--
Adam

Peter Baumgartner

unread,
Oct 28, 2018, 5:31:04 PM10/28/18
to django-d...@googlegroups.com
Reply all
Reply to author
Forward
0 new messages