Conteúdo
Esta seção mostra todas as configurações disponíveis para o conjunto de regras atual do WAF organizadas em três guias, Global, Regrase Fazendas. Tenha em mente que as alterações nesta seção devem ser aplicadas clicando no botão Inscreva-se botão.
Conjunto de regras do WAF de configurações globais
Essa configuração gerencia o comportamento de todas as regras contidas no conjunto.
Nome. Um rótulo que identifica facilmente uma regra. O rótulo que você escolher para nomear seu conjunto de regras não será modificável.
Organismo de solicitação de verificação. É um sinalizador que define se o corpo das solicitações HTTP deve ser analisado. Se este sinalizador estiver desabilitado, o corpo será ignorado e as correspondências de regra com os parâmetros do corpo da solicitação não serão processadas.
Limite do corpo da solicitação. É o número máximo de bytes do corpo da solicitação salvos para inspecionar a solicitação do corpo. Se este parâmetro tiver o valor 0, o WAF salvará completamente o tamanho do comprimento do conteúdo. Recomenda-se definir qualquer valor limite.
Verificar corpo de resposta. É um sinalizador para definir se o corpo da resposta HTTP deve ser analisado. Se este sinalizador estiver desabilitado, o corpo será ignorado e as correspondências de regras com os parâmetros do corpo da resposta não serão processadas. Uma resposta maior que 524288 (512KB) será ignorado.
Ação padrão. Essa caixa de seleção é usada como a resolução padrão quando nenhuma resolução é especificada em uma regra. Todas as correspondências da regra são um sucesso. Aqui está uma breve descrição de cada ação.
- Permitir. Habilitará o processamento do WAF atual até concluir a transação HTTP
- Passar. O WAF continuará avaliando a próxima regra sem cortar a transação HTTP.
- Denegar. Conclua a transação HTTP atual. Não será permitida a avaliação de mais regras. Se a regra corresponder na fase 1 ou 2 (analisando a solicitação), a solicitação não será entregue ao back-end. Se a regra corresponder na fase 3 ou 4 (analisando a resposta), a resposta não será entregue ao cliente.
- Redirecionar. A transação HTTP será interrompida e um redirecionamento HTTP será enviado ao cliente.
URL de redirecionamento. É a URL enviada ao cliente quando uma regra corresponde. Este URL tem uma resolução de redirecionamento configurada.
Fase padrão. Esta caixa de seleção é usada como a fase padrão quando nenhuma fase é especificada em uma regra. Uma fase é uma etapa HTTP que permite conectar uma regra WAF. Estas são as fases definidas:
- Cabeçalhos de solicitação são recebidos. A regra será executada quando todos os cabeçalhos de solicitação do cliente forem lidos pelo balanceador de carga.
- O corpo da solicitação é recebido. A regra será executada quando o corpo completo da solicitação do cliente estiver em buffer no balanceador de carga.
- Leitores de resposta são recebidos. A regra será executada quando todos os cabeçalhos de resposta do servidor forem lidos pelo balanceador de carga.
- Corpo de resposta é recebido. A regra será executada quando o corpo da resposta completa do servidor for lido pelo balanceador de carga.
- Antes do que logar. A regra é executada quando o processo do WAF conclui a tarefa de registro.
Log padrão. É uma ação padrão de log. Esse valor é usado se nenhuma ação sobre os logs for especificada nas configurações da regra.
Apenas registro. Se esta caixa de seleção estiver habilitada, o parâmetro de resolução das regras do conjunto nunca será executado. Este modo de trabalho só está disponível quando o aparelho está em execução.
Desativar Regras
Essas tabelas permitem desabilitar regras do conjunto sem modificá-las.
Regras ativadas. É a lista de regras ativadas atualmente no conjunto. As regras são identificadas por seus ID da regra ea sua descrição parâmetros.
Regras desativadas. É a lista de regras atualmente desativadas no conjunto.
Lista de Regras do WAF
O Regras A seção permite criar e modificar regras WAF que detectam e protegem contra ataques HTTP.
Essas regras são diretivas que são avaliadas sequencialmente, ou seja, na mesma ordem que é mostrada nesta tela. Se for necessário ordenar as regras, habilite o tipo botão e arraste e solte na posição solicitada.
Os parâmetros possíveis para as regras foram descritos abaixo.
ID. É um identificador para identificar a regra dentro do conjunto de regras. Este identificador corresponde à posição da regra no conjunto.
ID da regra. É um identificador exclusivo da regra. Não é possível vincular um farm a um conjunto waf que contenha duas regras com o mesmo ID de regra.
Descrição. É uma mensagem descritiva para identificar a regra. Esta mensagem será registrada em uma partida bem-sucedida.
Fase. A fase representa o passo da requisição HTTP onde uma regra será executada. As fases possíveis são:
- Cabeçalhos de solicitação são recebidos. A regra será executada quando todos os cabeçalhos de solicitação do cliente forem lidos pelo balanceador de carga.
- O corpo da solicitação é recebido. A regra será executada quando o corpo completo da solicitação do cliente estiver em buffer no balanceador de carga.
- Leitores de resposta são recebidos. A regra será executada quando todos os cabeçalhos de resposta do servidor forem lidos pelo balanceador de carga.
- Corpo de resposta é recebido. A regra será executada quando o corpo da resposta completa do servidor for lido pelo balanceador de carga.
- Antes do que logar. A regra é executada quando o processo do WAF conclui a tarefa de registro.
Resolução. Esta caixa de seleção é a ação escolhida para executar se todas as condições de correspondência forem alcançadas.
- Permitir. Nenhuma outra regra será avaliada (para a transação HTTP atual) se uma regra com essa ação corresponder.
- Passar. O WAF continuará avaliando a próxima regra sem cortar a transação HTTP.
- Denegar. Conclua a transação HTTP atual. Não haverá mais avaliação de regras. Se a regra corresponder na fase 1 ou 2 (analisando a solicitação), a solicitação não será entregue ao back-end. Se a regra corresponder na fase 3 ou 4 (analisando a resposta), a resposta não será entregue ao cliente.
- Redirecionar. A transação HTTP será interrompida e um redirecionamento HTTP será enviado ao cliente.
- Ação padrão. A resolução será definida se você não aplicar nenhuma. Normalmente, será o Permitir resolução
URL de redirecionamento. É a URL para onde o cliente será redirecionado caso essa regra execute um redirecionamento. Este parâmetro aparecerá quando um redirecionamento for escolhido no campo de resolução.
pular. Se todas as correspondências forem alcançadas, a regra ignorará o número de regras especificado neste campo.
Pular depois. Se todas as correspondências forem alcançadas, a regra saltará para outra posição do firewall. A regra pode saltar para uma 'marca' ou outro ID de regra. O ID da regra é executado após um salto e estará na mesma fase que a regra atual.
Execute. É o caminho para um script LUA. O script deve ser carregado anteriormente no balanceador de carga. Ele será executado assim que a primeira correspondência for alcançada.
Folhas para. Se este parâmetro estiver habilitado, a regra será registrada quando a primeira correspondência for alcançada.
Editando uma regra do WAF em bruto
Se o formulário não descrever adequadamente uma determinada regra WAF e o administrador não estiver familiarizado com o SecLang sintaxe, é possível criar regras ou um lote de regras através da opção de edição. Este campo aceita quaisquer instruções. Se as instruções e parâmetros são suportados pelo SecLang sintaxe, os parâmetros que são expressos no formulário não serão mostrados. No entanto, eles serão mostrados no formulário de edição e processados em tempo de execução.
Aqui estão os exemplos no modo de formulário e no modo bruto.
Modo de formulário
Este modo é mais fácil de usar para editar uma regra WAF.
Modo bruto
Este modo é para usuários mais avançados.
Criando uma regra do WAF
Quando uma nova regra é adicionada, ela será adicionada anexando-a às outras regras dos conjuntos. Para criar uma nova regra, há três maneiras de criar uma nova regra.
- Açao Social. Ele criará uma regra básica usando um formulário. Os parâmetros do formulário são os mesmos explicados no Lista de Regras do WAF seção. Se a execução da regra for condicional, clique no botão Adicionar condição botão para definir as condições de execução.
- Mark. Ele define uma marca de firewall. Essas marcas são usadas quando uma condição de correspondência é alcançada. O parâmetro esperado é o nome que identifica a marca.
- Personalizadas. Este formulário aceita regras (e um lote de regras) da sintaxe SecLang. Para mais informações sobre o SecLang sintaxe, visite o documentação do projeto libmodsecurity.
Lista de condições
A tabela na imagem abaixo mostra uma lista de condições que o pacote HTTP analisado deve corresponder à regra que será aplicada. Todas essas correspondências serão executadas na fase definida na regra. As correspondências serão verificadas sequencialmente e a regra será aplicada se todas elas forem cumpridas.
Para avaliar a correspondência, o WAF executará uma operação (parâmetros operador e Operativo) contra uma lista de variáveis. Se algumas variáveis da lista estiverem de acordo com a operação, elas serão consideradas bem-sucedidas. Por exemplo, na imagem a seguir, o cabeçalho IMAGENS são procurados na lista de cabeçalhos de solicitação enviados pelo cliente. Primeiro, ele decodifica a cada 64 bases de cada cabeçalho e depois converte os cabeçalhos em caracteres minúsculos. Quando a transformação das variáveis é concluída, uma expressão regular é aplicada, procurando a string imagens na lista de variáveis transformadas. o partida múltipla A opção tentará uma correspondência para cada operação de transformação (após a decodificação 64 de base e após a conversão de maiúsculas e minúsculas).
Criando Condições
A correspondência cria uma condição que deve ser alcançada para executar a regra WAF. Para avaliar a correspondência, o WAF executará uma operação (parâmetros operador e operando) contra uma lista de variáveis. Se houver uma correspondência entre as operações e as variáveis da lista, a correspondência é considerada bem-sucedida. Por exemplo, para procurar o host local (127.0.0.1) Na lista de cabeçalhos de solicitação e no campo HTTP do host virtual, ele pode ser avaliado com a seguinte configuração.
Estes são os parâmetros de configuração para definir as condições:
Variável. Ele sugere qual parte da transação HTTP a regra tentará corresponder. Você pode selecionar entre as variáveis listadas e as correspondências serão consideradas válidas se algumas delas corresponderem. Um menu suspenso aparecerá quando você clicar no campo de variáveis. Informações sobre a configuração da variável podem ser encontradas no Criando variáveis seção.
Transformações. A transformação é uma lista de modificações aplicadas às variáveis. As transformações são aplicadas sequencialmente, na mesma ordem mostrada no campo, e é possível tentar uma correspondência para cada transformação aplicada usando a opção multi-match. A transformação não modifica nenhuma informação da transação HTTP, elas são salvas em contextos temporais e removidas assim que a operação for concluída. Aqui é uma lista das transformações. Este parâmetro é usado para remover técnicas anti-evitar ou para remover dados de codificação.
operador. É assim que a regra tenta a partida. Este parâmetro é geralmente combinado com a Operativo. Aqui é uma lista de operadores.
Operativo. É isso que as regras tentam na partida. O parâmetro é geralmente combinado com o operador. O tipo do valor esperado deve estar alinhado com o operador.
Várias partidas. Este parâmetro é usado quando mais de uma transformação é configurada. A regra tentará combinar as variáveis, o operador, e as Operativo para cada valor de transformações. Os valores possíveis são: true, que habilita o multi-match, ou false, que desabilita o recurso de multi-match.
Não combina. Se esta caixa de seleção estiver habilitada, o resultado da partida será negado, convertendo para verdadeiro quando o resultado é falso ou convertendo para falso quando o resultado é verdadeiro.
Criando variáveis
As variáveis são parâmetros obrigatórios em uma condição de correspondência. Eles selecionam a parte do HTTP solicitar/resposta para buscar as informações.
Variáveis. Este parâmetro especifica o campo da solicitação/resposta HTTP para procurar as informações (hora, servidor…)
Argumento da variável. Quando uma variável é selecionada, às vezes é necessário especificar um elemento dela. Por exemplo, a imagem abaixo mostra como o cabeçalho da solicitação hospedeiro está selecionado marcado.
Contar elementos de variáveis. Esta caixa de seleção conta o número de elementos na variável. Esse recurso é útil quando a variável é uma lista.
Ignore esta variável para a correspondência. Se esta caixa de seleção estiver habilitada, a variável não será marcada na partida. Este recurso é útil quando uma variável que contém uma lista de valores vai ser verificada, mas também é necessária para excluir um deles.
Tabela de Variáveis
Variável | Descrição |
---|---|
ARGS | É uma coleção dos valores dos argumentos em uma solicitação. |
ARGS_JSON | É uma coleção com os valores dos argumentos em uma solicitação JSON. Essa variável estará disponível caso o WAF analise os argumentos JSON. O conjunto de regras REQUEST-901-INITIALIZATION deve ser ativado. |
ARGS_COMBINED_SIZE | tamanho total dos parâmetros da solicitação. Os arquivos são excluídos. |
ARGS_NAMES | É uma coleção dos nomes dos argumentos em uma solicitação. |
ARQUIVOS | Ele contém os nomes dos arquivos no arquivo do usuário. Somente quando os dados são multipartes / dados de formulário. |
FILES_COMBINED_SIZE | É o tamanho total dos arquivos em uma solicitação. Somente quando os dados são multipartes / dados de formulário. |
FILES_NAMES | É uma lista de nomes de arquivos usados para carregar os arquivos. Somente quando os dados são multipartes / dados de formulário. |
FILES_SIZES | Ele contém uma lista de tamanhos de arquivos individuais. Somente quando os dados são multipartes / dados de formulário. |
REQBODY_ERROR | Essa variável é 1 se o formato do corpo da solicitação não estiver correto para um JSON ou XML, caso contrário, ele terá o valor 0. |
REQUEST_BODY | É o pedido de corpo bruto. Caso a requisição não possua o cabeçalho “application/x-www-form-urlencoded”, é necessário utilizar “ctl:forceRequestBodyVariable” na fase REQUEST_HEADER. |
REQUEST_BODY_LENGTH | É o número de bytes do corpo da solicitação. |
REQUEST_COOKIES | É uma lista com todos os valores de cookie de solicitação. |
REQUEST_COOKIES_NAMES | É uma lista com todos os nomes de cookies de solicitação. |
REQUEST_HEADERS | Essa variável tem todos os cabeçalhos de solicitação. |
REQUEST_HEADERS_NAMES | Essa variável possui uma lista com os nomes dos cabeçalhos da solicitação. |
REQUEST_METHOD | É o método de solicitação. |
REQUEST_PROTOCOL | Essa variável contém o protocolo de versão HTTP da solicitação. |
REQUEST_URI | É o caminho da solicitação de URI. O host virtual é excluído. |
PATH_INFO | É a informação antes do caminho do URI. |
FULL_REQUEST | É o pedido completo. |
FULL_REQUEST_LENGTH | É o número de bytes que uma requisição completa pode ter. |
RESPONSE_BODY | É a resposta do corpo cru. |
RESPONSE_CONTENT_LENGTH | É o número de bytes do corpo da resposta. |
RESPONSE_HEADERS | Esta variável tem todos os cabeçalhos de resposta. |
RESPONSE_HEADERS_NAMES | Esta variável tem uma lista com os nomes dos cabeçalhos de resposta. |
RESPONSE_PROTOCOL | Esta variável contém o protocolo da versão HTTP de resposta. |
RESPONSE_STATUS | É o código HTTP de resposta. |
REMOTE_ADDR | É o endereço IP do cliente. |
REMOTE_PORT | É a porta em que o cliente inicializa a conexão. |
REMOTE_USER | É o nome do usuário autenticado. |
TIME | É a hora do servidor. O formato é horas: minutos: segundos. |
DURAÇÃO | É o número de milissegundos a partir da hora de início da transação atual. |
MULTIPART_FILENAME | É o nome do arquivo de campo em uma solicitação multipartes. |
MULTIPART_NAME | É o nome do campo em uma solicitação multipartes. |
MATCHED_VAR | É o valor correspondente na última operação de correspondência. Esse valor não precisa da opção de captura, mas é substituído em cada operação de correspondência. |
MATCHED_VARS | É uma lista de todos os valores correspondentes. |
SERVER_ADDR | É o endereço IP do servidor. |
SERVER_NAME | É o host virtual que obtém do URI de solicitação. |
ENV | São as variáveis de ambiente do WAF. |
TX | É uma coleção de variáveis para a transação atual. Essas variáveis serão removidas quando a transação terminar. As variáveis TX:0-TX:9 salvam os valores capturados com os operadores strRegex ou frases. |
Tabela de Operadores
Os operadores podem ter contextos diferentes. Esse contexto é indicado por um prefixo, como um int para inteiro, IP para operações de IP, str para strings ou validate para validar dados.
Variável | Descrição |
---|---|
strBegins | A regra corresponderá se qualquer uma das variáveis começar com o valor de operação. |
strContains | A regra corresponderá se alguma das variáveis contiver o valor de operação. |
strContainsWord | A regra corresponderá se alguma das variáveis contiver a palavra ou o valor da operação. |
strEnd | A regra corresponderá se qualquer uma das variáveis terminar com o valor de operação. |
strWithin | A regra corresponderá se alguma das variáveis iniciar com o valor de operando. |
strMatch | A regra corresponderá se alguma das variáveis corresponder ao valor de operacional. Esta operação pode ser uma lista de strings divididas pelo caractere | |
strEq | A regra corresponderá se alguma das variáveis for idêntica ao valor da operação. |
strRegex | A regra corresponderá se alguma das variáveis corresponder à expressão regular usada na operação. |
strPhrases | A regra corresponderá se alguma das variáveis corresponder a qualquer um dos valores da lista em operação. |
strPhrasesFromFile | Quase semelhante ao operador strPhrases, mas o operacional é onde ele será definido como uma lista de frases. |
intEQ | A regra corresponderá se alguma das variáveis for igual ao número usado na operação. |
intGE | A regra corresponderá se qualquer uma das variáveis for maior ou igual ao número usado na operação. |
intGT | A regra corresponderá se alguma das variáveis for maior que o número usado na operação. |
intLE | A regra corresponderá se qualquer uma das variáveis for menor ou igual ao número usado na operação. |
intLT | A regra corresponderá se alguma das variáveis for menor que o número usado na operação. |
detectSQLi | Detecta uma injeção de SQL na lista de variáveis. Este operador não espera nenhuma operação. |
detetarXSS | Aplica a detecção de injeção de XSS à lista de variáveis. Este operador não espera nenhuma operação. |
ipMatch | Tenta corresponder o IP ou segmentos de rede de operação com a lista de variáveis. |
ipMatchFromFile | É o mesmo que o operador ipMatch, mas tenta a correspondência das variáveis com um arquivo com uma lista de IPs e segmentos de rede. |
validateByteRange | Garante que o número de bytes das variáveis esteja em um dos valores operacionais. Um exemplo de operação é “10, 13, 32-126”. |
validateUrlEncoding | Ele valida dados codificados. Este operador deve ser usado apenas para dados que não codificam dados comumente ou para dados que são codificados várias vezes. |
validateUtf8Encoding | Ele valida as variáveis que são UTF-8. Este operador não espera nenhuma operação. |
verifyCreditCard | Verifica se as variáveis são números de cartão de crédito. Este parâmetro aceita uma expressão regular como operacional. Se corresponder, ele verificará com êxito o cartão. |
verifySSN | Ele verifica se as variáveis são um número do seguro social dos EUA. Este parâmetro aceita uma expressão regular como operacional, se corresponder, aplica a verificação do SSN. |
correspondência | Ele sempre retorna true, forçando uma correspondência. |
matchNever | Ele sempre retorna false, forçando uma não correspondência. |
Tabela de Transformação
Transformação | Descrição |
---|---|
base64Decode | Decodifica uma string codificada em Base64. |
base64DecodeExt | Decodifica uma string codificada em Base64, ignorando caracteres inválidos. |
sqlHexDecode | Decodifica dados hexadecimais SQL. |
base64Encode | Codifica usando a codificação Base64. |
cmdLine | Evita os problemas associados à linha de comando com escape. |
compressWhitespace | Converte qualquer um dos caracteres de espaço em branco (0x20, \ f, \ t, \ r, \ v, 0xa0) em espaços (ASCII 0x20), compactando vários caracteres de espaço consecutivos em um. |
cssDecode | Decodifica caracteres codificados usando as regras de escape CSS 2.x. Esta função usa apenas até dois bytes no processo de decodificação, o que significa que ela é usada para descobrir caracteres ASCII codificados usando codificação CSS (que normalmente não seria codificado) ou para combater a evasão, que é uma combinação de uma barra invertida e não -caracteres hexadecimais (por exemplo, ja\vascript é equivalente a javascript). |
escapeSeqDecode | Decodifica sequências de escape ANSI C: \ a, \ b, \ f, \ n, \ r, \ t, \ v, \\, \ ?, \ ', \ ”, \ xHH (hexadecimal), \ 0OOO (octal) . Codificações inválidas são deixadas na saída. |
hexDecode | Decodifica uma string que foi codificada usando o mesmo algoritmo usado em hexEncode (veja a entrada seguinte). |
hexEncode | Codifica cadeia (possivelmente contendo caracteres binários) substituindo cada byte de entrada por dois caracteres hexadecimais. Por exemplo, xyz é codificado como 78797a. |
htmlEntityDecode | Decodifica os caracteres codificados como entidades HTML. |
jsDecode | Decodifica seqüências de escape do JavaScript. |
comprimento | Procura o comprimento da string de entrada em bytes, colocando-a (como string) na saída. |
minúsculas | Converte todos os caracteres em minúsculas usando a localidade C atual. |
md5 | Calcula um hash MD5 da entrada de dados. O hash calculado está em um formato binário bruto e pode precisar ser codificado no texto a ser impresso (ou registrado). As funções de hash são comumente usadas em combinação com hexEncode. |
Nenhum | Não é uma função de transformação real, mas uma instrução para remover funções de transformação anteriores associadas à regra atual. |
normalizePath | Remove várias barras, auto-referências de diretório e referências inversas de diretório (exceto quando no início da entrada) da string de entrada. |
normalizePathWin | O mesmo que normalizePath, mas primeiro converte os caracteres de barra invertida em barras. |
parityEven7bit | Calcula a paridade par de dados de 7 bits, substituindo o 8º bit de cada byte de destino pelo bit de paridade calculado. |
parityOdd7bit | Calcula a paridade ímpar de dados de 7 bits, substituindo o 8º bit de cada byte de destino pelo bit de paridade calculado. |
parityZero7bit | Calcula a paridade zero de dados de 7 bits, substituindo o 8º bit de cada byte de destino por um bit de paridade zero, que permite a inspeção de dados de 7 bits de paridade par/ímpar como dados ASCII7. |
removeNulls | Remove todos os bytes NUL da entrada. |
removeWhitespace | Remove todos os caracteres de espaço em branco da entrada. |
substituirComentários | Substitui cada ocorrência de um comentário no estilo C (/ *… * /) por um único espaço (várias ocorrências consecutivas das quais não serão compactadas). Comentários não terminados também serão substituídos por espaço (ASCII 0x20). No entanto, uma rescisão autônoma de um comentário (* /) não será acionada. |
removerCommentsChar | Remove caracteres de comentários comuns (/ *, * /, -, #). |
substituirNulls | Substitui os bytes NUL na entrada por caracteres de espaço (ASCII 0x20). |
urlDecode | Decodifica uma string de entrada codificada por URL. Codificações inválidas (ou seja, aquelas que usam caracteres não hexadecimais, ou aquelas que estão no final da cadeia e têm um ou dois bytes ausentes) não são convertidas, mas nenhum erro é gerado. |
maiúsculas | Converte todos os caracteres em maiúsculas usando a localidade C atual. |
urlDecodeUni | Como urlDecode, mas com suporte para a codificação %, u específica da Microsoft. |
urlEncode | Codifica a string de entrada usando a codificação de URL. |
utf8toUnicode | Converte todas as sequências de caracteres UTF-8 em Unicode. Isso ajuda a normalização de entrada, especialmente para idiomas diferentes do inglês, minimizando falsos positivos e falsos negativos. |
sha1 | Calcula um hash SHA1 da string de entrada. O hash calculado está em formato binário bruto e pode precisar ser codificado no texto a ser impresso (ou registrado). Funções de hash são comumente usadas em combinação com hexEncode. |
trimLeft | Remove espaços em branco do lado esquerdo da string de entrada. |
trimRight | Remove espaços em branco do lado direito da string de entrada. |
aparar | Remove o espaço em branco dos lados esquerdo e direito da string de entrada. |
Configurações do Farms WAF
Esta seção permite atribuir o conjunto de regras WAF atual aos farms HTTP (s).
Nesta seção, será possível selecionar um ou mais farms (mantendo pressionado o botão shift do teclado) e, em seguida, atribuir o conjunto de regras WAF ou removê-los. Também é possível atribuí-lo ou removê-lo de todas as fazendas disponíveis com os botões de seta dupla.