Como permitir canais específicos do YouTube
Security Engineering Brazil
Julho, 2021
Versão 02
Autor:
Thiago Mourao, SE
Revisão:
Contents
Como permitir canais específicos do YouTube
Objetivo
Aviso
Limitações e Requisitos
Topologia
Scripts
Passo a Passo
Objetivo
O objetivo deste documento é descrever os passos necessário para fazer um controle granular por canal do YouTube no NGFW da Check Point, sendo possível assim, liberar ou bloquear o acesso de canais específicos do YouTube a partir do seu identificador único.
Aviso
O script utilizado nesta Prova de Conceito foi criado por mim (Thiago Mourão) utilizando a documentação oficial de referência da API Management API Reference v1.8 (link), para mais detalhes e atualizações das API disponíveis pela Check Point, favor acessar a página Check Point API Reference (link).
Limitações e Requisitos
- Para este laboratório, foi utilizado a versão 1.8 da Management API da Check Point, disponível a partir da versão R81.10 do Sistema Operacional Gaia. Para versões anteriores, favor consultar o guia de referência da versão correspondente para garantir suporte aos comandos utilizados.
- Para listar os vídeos de um canal do YouTube, foi utilizado ao YouTube Data API v3 (link) e para tal será necessário criar sua própria chave desta API.
- Para fazer o controle granular de URLs de vídeos do YouTube é necessário habilitar a Inspeção HTTPS (SSL Inspection)
Topologia
Neste laboratório, foi utilizado a versão R81.10 do Check Point Gaia configurado como Security Gateway e Manager (StandAlone) ao mesmo tempo e eles foram virtualizados no VMware Workstation 16.
Virtual Environment:
- 1 x Check Point StandAlone (Gateway/ Manager) R81.10
- 1 x Microsoft Windows 10
Scripts
ytcl_watch.sh
Este script executa as seguintes etapas:
- Checa se novos canais do YouTube foram adicionados ao objeto “YouTubeChannels-AllowList” no formato definido como YTCL-ID_do_Canal
- Caso um novo canal tenha sido adicionado os scripts “ytcl_diff.sh” e “ytcl_update.sh” deverão ser executados, caso não ocorra erros e os canais adicionados tenham vídeos públicos.
#!/bin/bash -f
source /var/opt/CPshrd-R81.10/tmp/.CPprofile.sh
#Script Directory EXECDIR="/home/admin/ytcl" APIKEY=$(cat apikey) MGMTIP="192.168.157.100"
cd $EXECDIR
echo "#### Executing ytcl_watch.sh at $(date -u) ####" echo "MGMT - Login" mgmt_cli login --management $MGMTIP api-key $APIKEY > sid_a.txt
echo "Erasing YouTubeChannels-AllowList.list file" > YouTubeChannels-AllowList.list
echo "Getting information from YouTubeChannels-AllowList Object and saving on file YouTubeChannels-AllowList.list" mgmt_cli --management $MGMTIP -s sid_a.txt show application-site-group name "YouTubeChannels-AllowList" --format json | jq '.members[] | select( .name | contains("YTCL"))' | jq '.name' | sort > YouTubeChannels-AllowList.list
echo "MGMT - Logout" mgmt_cli --management $MGMTIP -s sid_a.txt logout --format json | jq -c '.'
echo "Erasing YouTubeChannels-AllowList.diff file" > YouTubeChannels-AllowList.diff
echo "Creating new YouTubeChannels-AllowList.diff file" diff <(sort YouTubeChannels-AllowList.list) <(sort YouTubeChannels-AllowList.list1) | grep "<" | sed 's/< //' > YouTubeChannels-AllowList.diff
echo "Checking YouTubeChannels-AllowList.diff file" if [[ $(cat YouTubeChannels-AllowList.diff | wc -l) -gt 0 ]]
then echo "Running script $EXECDIR/ytcl_diff.sh to creating .url files" sh $EXECDIR/ytcl_diff.sh
else
echo "No changes on YouTubeChannels-AllowList.list file"
fi
echo "Copying file $EXECDIR/YouTubeChannels-AllowList.list to $EXECDIR/YouTubeChannels-AllowList.list1" cp -f $EXECDIR/YouTubeChannels-AllowList.list $EXECDIR/YouTubeChannels-AllowList.list1
if [[ $(sh -c 'ls *.url | grep YTCL' | wc -l) -gt 0 ]] then echo "Running script $EXECDIR/ytcl_update.sh to Updating URLs on Group YouTubeChannels-AllowList" sh $EXECDIR/ytcl_update.sh else echo "No YTCL.url files were found" fi
echo "Backup last URL files" sh -c 'ls *.url | grep YTCL' | sed 's/\(YTCL.*\)\.url/\1/' | while read NAME do mv -f ${NAME}.url ${NAME}.bkp-$(date +%Y%m%d%H%M%S) done
echo "#### End of Execution of ytcl_watch.sh at $(date -u) ####"
|
ytcl_diff.sh
Este script executa as seguintes etapas:
- Checa se o ID do canal existe e se o mesmo possui vídeos públicos
- Caso o Canal exista e tenha vídeos públicos, de forma recursiva, utilizando a API YouTube Data API v3, todas as URLs dos vídeos públicos são extraídas e salvas em arquivo.
#!/bin/bash -f
source /var/opt/CPshrd-R81.10/tmp/.CPprofile.sh
#Script Directory EXECDIR="/home/admin/ytcl"
#Google API Variables GAPIKEY=$(cat gapikey) CID="" MR=5 NTP_S=""
echo "#### Executing ytcl_diff.sh at $(date -u) ####"
cat YouTubeChannels-AllowList.diff | sed 's/"YTCL\-\(.*\)"/\1/' | while read CID do if [[ $(curl_cli -s -k "https://www.googleapis.com/youtube/v3/search?key=$GAPIKEY&channelId=$CID&part=snippet,id&order=date&..." | jq '.pageInfo.totalResults') -gt 0 ]] then echo "Erasing file YTCL-$CID.url" > YTCL-${CID}.url curl_cli -k -s "https://www.googleapis.com/youtube/v3/search?key=$GAPIKEY&channelId=$CID&part=snippet,id&order=date&..." > result-${CID}.txt while true do if [[ $(cat result-${CID}.txt | jq '.' | grep "nextPageToken" | wc -l) -gt 0 ]] then echo "nextPageToken ($NTP_S) found for channel $CID" NTP_S="$(cat result-${CID}.txt | jq '.' | grep nextPageToken | cut -d '"' -f 4)" echo "Adding URLs to file YTCL-${CID}.urls - nextPageToken will be $NTP_S" cat result-${CID}.txt | jq '.items[].id.videoId' | grep -v null | sed 's/^\"/\"www\.youtube\.com\/watch\?v\=/g' >> YTCL-${CID}.url curl_cli -k -s "https://www.googleapis.com/youtube/v3/search?key=$GAPIKEY&channelId=$CID&part=snippet,id&order=date&..." > result-${CID}.txt else echo "nextPageToken not found or last page for channel $CID" echo "Adding last page of URLs to file YTCL-$CID.urls" cat result-${CID}.txt | jq '.items[].id.videoId' | grep -v null | sed 's/^\"/\"www\.youtube\.com\/watch\?v\=/g' >> YTCL-${CID}.url echo "File $CID.url finished" break fi done else echo "YouTube Channel $CID - No public videos found or channel ID is wrong" fi done
echo "#### End of Execution of ytcl_diff.sh at $(date -u) ####"
|
ytcl_update.sh
Este script executa as seguintes etapas:
- Atualiza o objeto correspondente do Canal do YouTube com o título do canal no campo “COMMENTS”, que pode ser utilizado como parâmetro de busca no SmartConsole na árvore de objetos
- Verifica quais URLs dos vídeos públicos identificadas no processo anterior ainda não foram cadastradas no objeto correspondendo do canal e adiciona elas.
#!/bin/bash -f
source /var/opt/CPshrd-R81.10/tmp/.CPprofile.sh
#Script Directory EXECDIR="/home/admin/ytcl"
#Check Point Management Variables APIKEY=$(cat apikey) MGMTIP="192.168.157.100"
#Google API Variables GAPIKEY=$(cat gapikey)
cd $EXECDIR
echo "#### Executing ytcl_update.sh at $(date -u) ####"
echo "MGMT - Login" mgmt_cli login --management $MGMTIP api-key $APIKEY > sid_b.txt
sh -c 'ls *.url' |grep YTCL | sed 's/YTCL\-\(.*\)\.url/\1/' | while read NAME do mgmt_cli --management $MGMTIP -s sid_b.txt show application-site name "YTCL-${NAME}" --format json | jq '."url-list"[]' | sort > YTCL-${NAME}.list
echo "Creating new YTCL-${NAME}.diff file" diff YTCL-${NAME}.url YTCL-${NAME}.list | grep "<" | sed 's/< //' > YTCL-${NAME}.diff
echo "Checking YTCL-${NAME}.diff file" if [[ $(cat YTCL-${NAME}.diff | wc -l) -gt 0 ]] then echo "Updating Channel Title on Object comments" CTITLE=$(curl_cli -k -s "https://www.googleapis.com/youtube/v3/search?key=$GAPIKEY&channelId=${NAME}&part=snippet,id&order=da..." | jq '.items[].snippet.channelTitle') echo "mgmt_cli --management $MGMTIP -s sid_b.txt set application-site name \"YTCL-${NAME}\" comments $CTITLE --format json" mgmt_cli --management $MGMTIP -s sid_b.txt set application-site name "YTCL-${NAME}" comments "$CTITLE" --format json | jq -c '.'
echo "Reading file YTCL-${NAME}.diff and update object ${NAME}" cat YTCL-${NAME}.diff | while read URL do mgmt_cli --management $MGMTIP -s sid_b.txt set application-site name "YTCL-${NAME}" url-list.add $URL --format json | jq -c '.' done else echo "No changes on YTCL-${NAME}.diff file" fi
done
echo "MGMT - Publishing Session" mgmt_cli --management $MGMTIP -s sid_b.txt publish --format json | jq -c '.'
echo "MGMT - Pushing Policy" mgmt_cli --management $MGMTIP -s sid_b.txt install-policy policy-package "standard" access true threat-prevention false targets.1 "R81.10-StandAlone" --format json | jq -c '.'
echo "MGMT - Logout" mgmt_cli --management $MGMTIP -s sid_b.txt logout --format json | jq -c '.'
echo "#### End of Execution of ytcl_update.sh at $(date -u) ####"
|
Passo a Passo
- Habilitar as Funcionalidades: “Application Control” e “URL Filtering”.
- Habilitar a Funcionalidade de Inspeção SSL “HTTPS Inspection”.
- Criar o objeto “YouTube-Domain”
- Adicionar o domínio do YouTube: \.youtube\.com
- Marcar a opção “URLs are defined as Regular Expression”
- Criar o objeto “Application/Site Group” com o nome “YouTubeChannels-AllowList”
- Adicionar o domínio do YouTube: \.youtube\.com
- Marcar a opção “URLs are defined as Regular Expression”
- Adicionar ao grupo “YouTubeChannels-AllowList”
- Clicar no botão de +
- Clicar no *
- Selecionar a opção “Application/Site...”
- Configurar o grupo usando o seguinte padrão
- Nomenclatura do Nome: YTCL-{ID do Canal}
- Adicionar as URLs básicas que deseja permitir do canal:
- Desmarcar a opção “URLs are defined as Regular Expression”
- Configurar regras de acesso para:
- Bloqueio do protocolo QUIC
- Regra para acesso Web Filtering com Inline Layer (Application Control & URL Filtering)
- Regra de liberação das URLs dos vídeos de cos Canis do YouTube (YouTubeChannels-AllowList)
- Regra de bloqueio do Domínio do YouTube (YouTube-Domain)
- Liberação da aplicação YouTube
- Copiar os 03 (três) arquivos de scripts para a gerência
- Criar o arquivo apikey contento a chave da API do usuário da Gerência do Check Point e o arquivo gpaikey contento a chave da API do Google para fazer consulta via YouTube Data API v3
- Executar o script ytcl_watch.sh
- Checa o conteúdo do objeto chamado “YouTubeChannels-AllowList” e procura por lista de Application/Site que comecem com o prefixo “YTCL-“ e salva no arquivo “YouTubeChannels-AllowList.list”.
- Compara o conteúdo do arquivo “YouTubeChannels-AllowList.list” com o do arquivo “YouTubeChannels-AllowList.list1” para saber se algum novo canal foi adicionado e gera o arquivo “YouTubeChannels-AllowList.diff”
- Caso o arquivo “YouTubeChannels-AllowList.diff” possua alguma informação ele executa um novo script chamado “ytcl_diff.sh” para criar os arquivos YTCL-{Channel_ID}.url com as URLs de todos os vídeos públicos de cada novo canal que foi adicionado ao objeto “YouTubeChannels-AllowList”
- Execução automática do script ytcl_diff.sh para criar os arquivos {Channel_ID}.url, caso o arquivo “YouTubeChannels-AllowList.diff” possua alguma informação
- O conteúdo do arquivo “YouTubeChannels-AllowList” é movido para o arquivo “YouTubeChannels-AllowList1” para servir como base de comparação para a próxima execução do script.
- Execução automática do script ytcl_update.sh caso existam arquivos YTCL-{Channel_ID}.url no diretório para atualizar os objetos referentes ao Canais do YouTube com a lista de URLs que ainda não estejam cadastradas, além de atualizar o campo COMMENTS com o título do canal.
- O script move os arquivos YTCL-{Channel_ID}.url gerados no passo anterior para o formato YTCL-{Channel_ID}.bkp-$(date +%Y%m%d%H%M%S) para servir de histórico de quais URLs foram adicionadas naquele momento
- Execução automática do script ytcl_diff.sh
- Para cada linha do arquivo “YouTubeChannels-AllowList.diff” são executadas as seguintes ações:
- Parsing para encontrar o ID do Canal do YouTube, conforme nomenclatura definida na criação dos objetos do tipo “Application/Site”, seguindo a regra YTCL-{Channel_ID}
- Apagar, caso exista, o conteúdo do arquivo YTCL-{Channel_ID}.url
- Checar se o ID do Canal é válido e se o Canal tem vídeo publico
- Listar de forma recursiva todas as URLs dos vídeos públicos do canal e salvar no arquivo {Channel_ID}.url
- Execução automática do script ytcl_diff.sh
- Extrai o ID do canal do YouTube que foi adicionado ao objeto “YouTubeChannels-AllowList”, conforme nomenclatura especificada YTCL-{Channel_ID}
- Consulta o objeto do tipo “Application/Site” adicionado ao grupo “YouTubeChannels-AllowList” e salva a lista atual de URL de cada objeto um arquivo “YTCL-{Channel_ID}.list
- Verifica a diferença entre os arquivos “YTCL-{Channel_ID}.url”, gerado pelo script ytcl_diff.sh e o arquivo recém criado “YTCL-{Channel_ID}.list” e salva as URLs adicionais do arquivo “YTCL-{Channel_ID}.url” em outro arquivo “YTCL-{Channel_ID}.diff
- Atualiza o campo “Comments” do objeto “YTCL-{Channel_ID}” com o Título do Canal do YouTube correspondente
- Atualiza a lista de URLs do objeto “YTCL-{Channel_ID}” com as URLs adicionais salvas no arquivo “YTCL-{Channel_ID}.diff”
- Publica a sessão
- Instala a Política
- Lista de arquivos no diretório, depois da execução