Проверьте имя хоста сервера, который вызвал API - PullRequest
5 голосов
/ 05 августа 2020

У меня есть AWS ELB, подключенный к нескольким EC2, на которых запущен сервер AWS Flask. Я не уверен, передает ли AWS ELB полный запрос в EC2 или нет. Я знаю, что мы можем установить ограничения на уровне ELB, но я хочу наложить ограничения только на одну конечную точку и проверить имя хоста сервера, который вызвал конечную точку в Flask. Возможно ли это?

Ответы [ 3 ]

3 голосов
/ 12 августа 2020

Вы можете попробовать следующее:

import socket
from flask import request


@app.route("/your_route", methods=["GET"])
def your_route():
    hostname, aliaslist, ipaddrlist = socket.gethostbyaddr(request.remote_addr)

Обратите внимание, что полагаться на remote_addr ненадежно, однако, поскольку это не связано с topi c, я буду ссылаться на это ответ который использует ProxyFix :

Для получения дополнительной информации о socket.gethostbyaddr(), пожалуйста, проверьте: socket.gethostbyaddr ()

2 голосов
/ 13 августа 2020

Я предлагаю вам использовать шаблон декоратора для таких случаев, то есть вы добавляете новую опцию конфигурации IP_LIST с некоторым набором адресов, разделенным запятой.

IP_LIST = "127.0.0.1,127.0.0.2,..."

После этого добавьте новую функцию декоратора и украсите любая конечная точка с декоратором.

def ip_verified(fn):
    """
    A custom decorator that checks if a client IP is in the list, otherwise block access.
    """

    @wraps(fn)
    def decorated_view(*args, **kwargs):
        ip_list_str = current_app.config['IP_LIST']
        ip_list = ip_list_str.split(",") if ip_list_str else []

        if request.headers.getlist("X-Forwarded-For"):
            remote_ip = request.headers.getlist("X-Forwarded-For")[0]
        else:
            remote_ip = request.remote_addr

        if remote_ip not in ip_list:
            return "Not sufficient privileges", 403

        return fn(*args, **kwargs)

    return decorated_view

@app.route("/your_route", methods=["GET"])
@ip_verified
def your_route():
    ...
0 голосов
/ 13 августа 2020

Один из вариантов - использовать Network Load Balancer , который сохраняет IP-адрес клиента, выполняющего запрос. Вы даже можете сделать так, чтобы NLB выполнял завершение TLS точно так же, как ELB. NLB не изменяет данные в сетевом запросе, за исключением завершения TLS, если вы решите использовать это.

...