Create a Post
cancel
Showing results for 
Search instead for 
Did you mean: 
Thiago_Mourao
Employee
Employee

Como permitir canais específicos do YouTube

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

 

image.png



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

  1. Habilitar as Funcionalidades: “Application Control” e “URL Filtering”.
    image.png
  2. Habilitar a Funcionalidade de Inspeção SSL “HTTPS Inspection”.
    image.png
  3. Criar o objeto “YouTube-Domain”
    • Adicionar o domínio do YouTube: \.youtube\.com
    • Marcar a opção “URLs are defined as Regular Expression
      image.png
  4. 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
      image.png
  5. Adicionar ao grupo “YouTubeChannels-AllowList”
    • Clicar no botão de +
    • Clicar no *
    • Selecionar a opção “Application/Site...
      image.png
  6. Configurar o grupo usando o seguinte padrão
  7. 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
        image.png

        image.png

        image.png
  8. Copiar os 03 (três) arquivos de scripts para a gerência
    image.png
  9. 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
    image.png
  10. Executar o script ytcl_watch.sh
    image.png 
    1. 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”.
      image.png

      image.png
    2. 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
      image.png
    3. 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
      image.png
    4. 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
    5. 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.
    6. 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.
    7. 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
  11. Execução automática do script ytcl_diff.sh
    image.png 
    1. Para cada linha do arquivo “YouTubeChannels-AllowList.diff” são executadas as seguintes ações:
    2. 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}
    3. Apagar, caso exista, o conteúdo do arquivo YTCL-{Channel_ID}.url
    4. Checar se o ID do Canal é válido e se o Canal tem vídeo publico
    5. Listar de forma recursiva todas as URLs dos vídeos públicos do canal e salvar no arquivo {Channel_ID}.url
      image.png

      image.png
  12. Execução automática do script ytcl_diff.sh
    image.png
    image.png
    image.png
    1. Extrai o ID do canal do YouTube que foi adicionado ao objeto “YouTubeChannels-AllowList”, conforme nomenclatura especificada YTCL-{Channel_ID}
    2. 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
      image.png
    3. 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
      image.png
    4. Atualiza o campo “Comments” do objeto “YTCL-{Channel_ID}” com o Título do Canal do YouTube correspondente
      image.png

      image.png
    5. Atualiza a lista de URLs do objeto “YTCL-{Channel_ID}” com as URLs adicionais salvas no arquivo “YTCL-{Channel_ID}.diff
      image.png
    6. Publica a sessão
    7. Instala a Política
  13. Lista de arquivos no diretório, depois da execução
    image.png 
    •  

 

 

 

(1)
0 Replies