
Uma coleção de perguntas e respostas para testes de administração de sistemas Linux. Teste seus conhecimentos e habilidades em diferentes áreas com estas perguntas e respostas.
:star:
"Um grande Administrador não precisa saber tudo, mas deve ser capaz de criar soluções incríveis para projetos impossíveis." - cwheeler33 (ServerFault)
:star:
"Minhas habilidades são fazer as coisas funcionarem, não saber um bilhão de fatos. [...] Se preciso corrigir um sistema, identifico o problema, verifico os logs e procuro os erros. Se preciso implementar uma solução, pesquiso a solução correta, implemento e documento, depois só tenho uma ideia geral de como funciona, a menos que interaja com ela com frequência... é por isso que está documentado." - Sparcrypt (Reddit)
ℹ️ Este projeto contém 284 perguntas e respostas de teste que podem ser usadas para testar seu conhecimento ou durante uma entrevista/exame para cargo como Administrador de Sistemas Linux (*nix).
✔️ As respostas são apenas exemplos e não esgotam todo o tópico. A maioria delas contém recursos úteis para um entendimento mais profundo.
⚠️ Perguntas marcadas com *** ainda não têm resposta ou a resposta está incompleta - faça um pull request para adicioná-las!
🚥 Se você encontrar algo que não faça sentido, ou algo que pareça errado, por favor, faça um pull request e adicione explicações válidas e bem fundamentadas sobre suas alterações ou comentários.
📚 Para melhorar seus conhecimentos/habilidades, veja devops-interview-questions. Parece realmente interessante.
» Todas as sugestões são bem-vindas «
Minha distribuição Linux favorita:
Recursos úteis:
GNU não é realmente um SO. É mais um conjunto de regras ou filosofias que regem o software livre, que ao mesmo tempo deu origem a um monte de ferramentas enquanto tentava criar um SO. Portanto, as ferramentas GNU são basicamente versões abertas de ferramentas que já existiam, mas foram reimplementadas para se conformar aos princípios do software aberto. GNU/Linux é uma combinação dessas ferramentas com o kernel Linux para formar um SO completo, mas existem outros GNUs, por exemplo, GNU/Hurd.
Unix e BSD são implementações "mais antigas" do POSIX que têm vários níveis de "código fechado". Unix geralmente é totalmente fechado, mas há tantas variações de Unix quanto de Linux (senão mais). BSD geralmente não é considerado "aberto", mas era considerado muito aberto quando foi lançado. Sua licença também permitia uso comercial com muito menos restrições do que as licenças mais "abertas" da época permitiam.
Linux é o mais novo dos quatro. A rigor, é "apenas um kernel"; no entanto, em geral, é pensado como um SO completo quando combinado com as Ferramentas GNU e vários outros componentes essenciais.
As principais diferenças governantes entre eles são seus ideais. Unix, Linux e BSD têm ideais diferentes que implementam. Todos são POSIX e são basicamente intercambiáveis. Eles resolvem alguns dos mesmos problemas de maneiras diferentes. Então, além dos ideais e de como escolhem implementar os padrões POSIX, há pouca diferença.
Para mais informações, sugiro que leia um breve artigo sobre a criação do GNU, OSS, Linux, BSD e UNIX. Eles serão tendenciosos em relação às suas ideias individuais, mas esses artigos devem dar uma melhor ideia das diferenças.
Recursos úteis:
CLI é um acrônimo para Interface de Linha de Comando ou Interpretador de Linguagem de Comando. A linha de comando é uma das formas mais poderosas de controlar seu sistema/computador.
Em sistemas do tipo Unix, CLI é a interface pela qual um usuário pode digitar comandos para o sistema executar. A CLI é muito poderosa, mas não é muito tolerante a erros.
A CLI permite que você faça manipulações com os internos do seu sistema e com código de uma forma muito mais refinada. Oferece maior flexibilidade e controle do que uma GUI, independentemente do SO usado. Muitos programas que você pode querer usar em seu software, hospedados por exemplo no Github, também exigem a execução de alguns comandos na CLI para colocá-los em funcionamento.
Minhas ferramentas favoritas
screen - multiplexador de terminal gratuito, posso iniciar uma sessão e meus terminais serão salvos mesmo quando a conexão for perdida, para que eu possa retomar mais tarde ou de casassh - o comando mais valioso para aprender, posso usá-lo para fazer coisas incríveis:
sshfsrsync sem daemon rsync, iniciando um via sshvi/vim - é o editor de texto mais popular e poderoso, é universal, funciona muito rápido, mesmo em arquivos grandesbash-completion - contém várias regras de conclusão predefinidas para o shellBASH é meu favorito. É realmente uma questão de preferência, onde adoro a sintaxe e ela simplesmente "clica" para mim. A sintaxe de redirecionamento de entrada/saída (>>, << 2>&1, 2>, 1>, etc) é semelhante ao C++, o que facilita o reconhecimento.
Também gosto do shell ZSH, porque é muito mais customizável que o BASH. Ele possui o framework Oh-My-Zsh, conclusão de tabulação baseada em contexto poderosa, correspondência de padrões/globbing turbinada, módulos carregáveis e muito mais.
Recursos úteis:
man [nome_do_comando] pode ser usado para ver uma descrição de um comando (ex.: man less, man cat)
-h ou --help alguns programas implementam a impressão de instruções quando este parâmetro é passado (ex.: python -h e python --help)
w - muitas informações úteis com o uptime do servidortop - você pode ver todos os processos em execução, depois ordená-los por CPU, uso de memória e maisnetstat - para saber em qual porta e IP seu servidor está ouvindo e quais processos estão usando essas portasdf - relata a quantidade de espaço em disco disponível sendo usado por sistemas de arquivoshistory - informa o que foi executado anteriormente pelo usuário ao qual você está conectado atualmenteRecursos úteis:
ls -al significam?Na ordem da saída:```bash -rwxrw-r-- 1 root root 2048 Jan 13 07:11 db.dump
- permissões de arquivo,
- número de links,
- nome do proprietário,
- grupo do proprietário,
- tamanho do arquivo,
- hora da última modificação,
- nome do arquivo/diretório
As permissões de arquivo são exibidas da seguinte forma:
- o primeiro caractere é `-` ou `l` ou `d`, `d` indica um diretório, `-` representa um arquivo, `l` é um link simbólico (ou link suave) — um tipo especial de arquivo
- três conjuntos de caracteres, três vezes, indicando permissões para proprietário, grupo e outros:
- `r` = legível
- `w` = gravável
- `x` = executável
No seu exemplo `-rwxrw-r--`, isso significa que a linha exibida é:
- um arquivo regular (exibido como `-`)
- legível, gravável e executável pelo proprietário (`rwx`)
- legível, gravável, mas não executável pelo grupo (`rw-`)
- legível, mas não gravável ou executável por outros (`r--`)
Recursos úteis:
- [O que significam os campos na saída de ls -al? (original)](https://unix.stackexchange.com/questions/103114/what-do-the-fields-in-ls-al-output-mean)
</details>
<details>
<summary><b>Como obter uma lista de usuários logados?</b></summary><br>
Para um resumo dos usuários logados, incluindo cada login de um nome de usuário, os terminais aos quais os usuários estão conectados, a data/hora em que fizeram login e, possivelmente, o computador a partir do qual estão fazendo a conexão, digite:```bash
# It uses /var/run/utmp and /var/log/wtmp files to get the details.
who
A vantagem mais significativa de executar um processo em segundo plano é que você pode realizar qualquer outra tarefa simultaneamente enquanto outros processos estão sendo executados em segundo plano. Assim, mais processos podem ser concluídos em segundo plano enquanto você trabalha em diferentes processos. Isso pode ser alcançado adicionando um caractere especial & ao final do comando.
Geralmente, aplicativos que levam muito tempo para executar e não exigem interação do usuário são enviados para segundo plano, para que possamos continuar nosso trabalho no terminal.
Por exemplo, se você quiser baixar algo em segundo plano, você pode:```bash wget https://url-to-download.com/download.tar.gz &
Quando você executa o comando acima, obtém a seguinte saída:```bash
[1] 2203
Aqui, 1 é o número de série do trabalho e 2203 é o PID do trabalho.
Você pode ver os trabalhos em execução em segundo plano usando o seguinte comando:```bash jobs
Quando você executa um job em segundo plano, ele fornece um PID do job. Você pode matar o job em execução em segundo plano usando o seguinte comando:```bash
kill PID
Substitua o PID pelo PID do job. Se você tiver apenas um job em execução, você pode trazê-lo para o primeiro plano usando:```bash fg
Se você tiver vários jobs rodando em segundo plano, você pode trazer qualquer job para o primeiro plano usando:```bash
fg %#
Substitua o # pelo número de série da tarefa.
Recursos úteis:
A ser preenchido.
Executar (tudo) como root é ruim porque:
Estupidez: nada impede você de cometer um erro por descuido. Se você tentar modificar o sistema de alguma forma potencialmente prejudicial, precisa usar o sudo, o que garante uma pausa (enquanto você digita a senha) para garantir que não está prestes a cometer um erro.
Segurança: fica mais difícil de ser hackeado se você não souber a conta de login do usuário administrador. root significa que você já tem metade do conjunto de credenciais de administrador em funcionamento.
Você realmente não precisa disso: se precisar executar vários comandos como root e estiver irritado por ter que digitar sua senha várias vezes quando o sudo expirou, tudo o que precisa fazer é sudo -i e você se torna root. Quer executar alguns comandos usando pipes? Então use sudo sh -c "comando1 | comando2".
Você sempre pode usá-lo no console de recuperação: o console de recuperação permite recuperar de um erro grave ou corrigir um problema causado por um aplicativo (que você ainda teve que executar como sudo). O Ubuntu não tem senha para a conta root neste caso, mas você pode pesquisar online como alterar isso – isso dificultará que qualquer pessoa com acesso físico ao seu computador possa causar danos.
Recursos úteis:
Você usaria top/htop para ambos. Usando os comandos free e vmstat podemos exibir as estatísticas de memória física e virtual, respectivamente. Com a ajuda do comando sar vemos a utilização da CPU e outras estatísticas (mas o sar nem está instalado na maioria dos sistemas).
Recursos úteis:
As cargas médias do Linux são "médias de carga do sistema" que mostram a demanda de thread (tarefa) em execução no sistema como um número médio de threads em execução mais em espera. Isso mede a demanda, que pode ser maior do que o sistema está atualmente processando. A maioria das ferramentas mostra três médias, para 1, 5 e 15 minutos.
Esses 3 números não são os números para as diferentes CPUs. Esses números são valores médios do número de carga para um determinado período de tempo (dos últimos 1, 5 e 15 minutos).
Carga média é geralmente descrita como "comprimento médio da fila de execução". Portanto, poucos processos ou threads que consomem CPU podem elevar a carga média acima de 1. Não há problema se a carga média for menor que o número total de núcleos de CPU. Mas se ficar maior que o número de CPUs, isso significa que alguns threads/processos permanecerão na fila, prontos para executar, mas aguardando CPU livre.
A ideia é dar uma ideia do estado do sistema, média ao longo de vários períodos de tempo. Como é uma média, leva tempo para voltar a 0 após uma carga pesada ter sido colocada no sistema.
Algumas interpretações:
Recursos úteis:
As senhas não são armazenadas em lugar nenhum no sistema. O que está armazenado em /etc/shadow são os chamados hashes das senhas.
Um hash de algum texto é criado executando uma chamada função unidirecional no texto (senha), criando assim uma string para verificar. Por design, é "impossível" (computacionalmente inviável) reverter esse processo.
Variantes mais antigas do Unix armazenavam as senhas criptografadas em /etc/passwd junto com outras informações sobre cada conta.
As mais novas simplesmente têm um * no campo relevante em /etc/passwd e usam /etc/shadow para armazenar a senha, em parte para garantir que ninguém tenha acesso de leitura às senhas quando precisar apenas das outras informações (o shadow geralmente é protegido mais fortemente do que o passwd).
Para mais informações, consulte man crypt, man shadow, man passwd.
Recursos úteis:
Para alterar todos os diretórios, por exemplo, para 755 (drwxr-xr-x):```bash
find /opt/data -type d -exec chmod 755 {} ;
Para alterar todos os arquivos, por exemplo, para **644** (`-rw-r--r--`):```bash
find /opt/data -type f -exec chmod 644 {} \;
Recursos úteis:
command not found. Como rastrear a origem do erro e resolvê-lo?Parece que em algum momento estão sobrescrevendo a variável de ambiente PATH padrão. O tipo de erros que você tem indica que PATH não contém, por exemplo, /bin, onde os comandos (incluindo bash) residem.
Uma maneira de começar a depurar seu script ou comando bash seria iniciar um subshell com a opção -x:```bash
bash --login -x
Isso mostrará cada comando e seus argumentos, que são executados ao iniciar esse shell.
Também é muito útil mostrar os valores da variável `PATH`:```bash
echo $PATH
Se você executar isto:```bash PATH=/bin:/sbin:/usr/bin:/usr/sbin
a maioria dos comandos deve começar a funcionar - e então você pode editar `~/.bash_profile` em vez de `~/.bashrc` e corrigir o que está redefinindo `PATH` lá. Os valores padrão da variável `PATH` para **root** e outros usuários estão no arquivo `/etc/profile`.
Recurso útil:
- [Como adicionar corretamente um caminho ao PATH?](https://unix.stackexchange.com/questions/26047/how-to-correctly-add-a-path-to-path)
</details>
<details>
<summary><b>Você digita <code>CTRL + C</code> mas seu script ainda está rodando. Como pará-lo?</b></summary><br>
Na maioria dos casos, você pode parar um script em execução usando a combinação de teclas `CTRL + C`. Isso envia um sinal de interrupção (SIGINT) para o script, que encerra sua execução. Se isso não funcionar e o script ainda estiver rodando, você pode tentar usar a combinação `CTRL + \`, que envia um sinal de saída (SIGQUIT) para o script, podendo terminá-lo imediatamente.
Alternativamente, se você estiver usando um terminal ou interface de linha de comando, pode tentar usar o comando `kill` para enviar um sinal ao processo do script. Você pode encontrar o ID do processo (PID) do script usando os comandos `ps` ou `top`, e depois usar `kill` com o PID para parar o script.
Em alguns casos, pode ser necessário usar o comando `kill -9` para forçar a parada do script, pois o comando kill normal pode não funcionar se o script estiver travado ou não responder. A opção `-9` envia um sinal SIGKILL, que força o processo a parar imediatamente.
</details>
<details>
<summary><b>O que é o comando <code>grep</code>? Como combinar múltiplas strings na mesma linha?</b></summary><br>
Os utilitários `grep` são uma família de ferramentas Unix, incluindo `egrep` e `fgrep`.
`grep` pesquisa padrões em arquivos. Se você está procurando por um padrão específico na saída de outro comando, o `grep` destaca as linhas relevantes. Use este comando grep para pesquisar arquivos de log, processos específicos e mais.
Para combinar múltiplas strings:```bash
grep -E "string1|string2" filename
Se você quiser executar cada comando apenas se o anterior tiver sido bem-sucedido, então combine-os usando o operador &&:```bash
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install
Se um dos comandos falhar, então todos os outros comandos seguintes não serão executados.
Se você quiser executar todos os comandos independentemente de os anteriores terem falhado ou não, separe-os com ponto e vírgula:```bash
cd /my_folder; rm *.jar; svn co path to repo; mvn compile package install
No seu caso, acredito que você queira o primeiro caso, onde a execução do próximo comando depende do sucesso do anterior.
Você também pode colocar todos os comandos em um script e executá-lo em vez disso:```bash
#! /bin/sh
cd /my_folder
&& rm *.jar
&& svn co path to repo
&& mvn compile package install
Recursos úteis:
- [Executar e combinar vários comandos Linux em uma linha (original)](https://stackoverflow.com/questions/13077241/execute-combine-multiple-linux-commands-in-one-line)
</details>
<details>
<summary><b>Qual representação simbólica você pode passar para <code>chmod</code> para dar a todos os usuários acesso de execução a um arquivo sem afetar outras permissões?</b></summary><br>```bash
chmod a+x /path/to/file
a - para todos os utilizadoresx - para permissão de execuçãoPara sincronizar o conteúdo de dir1 para dir2 no mesmo sistema, digite:```bash rsync -av --progress --delete dir1/ dir2
- `-a`, `--archive` - modo de arquivo
- `--delete` - eliminar ficheiros extra dos diretórios de destino
- `-v`, `--verbose` - modo verboso (aumentar verbosidade)
- `--progress` - mostrar progresso durante a transferência
Recursos úteis:
- [Como posso sincronizar dois diretórios locais? (original](https://unix.stackexchange.com/questions/392536/how-can-i-sync-two-local-directories)
- [Sincronizando pastas com rsync](https://www.jveweb.net/en/archives/2010/11/synchronizing-folders-with-rsync.html)
</details>
<details>
<summary><b>Muitas tarefas básicas de manutenção exigem que você edite arquivos de configuração. Explique maneiras de desfazer as alterações feitas.</b></summary><br>
- backup manual de um ficheiro antes de editar (com expansão de chaves como esta: `cp filename{,.orig}`)
- cópia manual da estrutura de diretórios onde o ficheiro está armazenado (ex.: `cp`, `rsync` ou `tar`)
- faça um backup do ficheiro original no seu editor (ex.: defina regras no ficheiro de configuração do seu editor)
- a melhor solução é usar `git` (ou qualquer outro controle de versão) para manter o controle dos ficheiros de configuração (ex.: `etckeeper` para o diretório `/etc`)
Recursos úteis:
- [Fazer backup de ficheiro com .bak antes da extensão do nome do ficheiro](https://unix.stackexchange.com/questions/66376/backup-file-with-bak-before-filename-extension)
- [É uma boa ideia usar git para controle de versão de ficheiros de configuração?](https://superuser.com/questions/1037211/is-it-a-good-idea-to-use-git-for-configuration-file-version-controlling)
</details>
<details>
<summary><b>Você precisa encontrar todos os ficheiros maiores que 20MB. Como você faz?</b></summary><br>```bash
find / -type f -size +20M
sudo su - e não apenas sudo su?sudo está presente na maioria das distribuições Linux modernas onde (mas nem sempre) o usuário root está desabilitado e não possui senha definida. Portanto, você não pode alternar para o usuário root com su (pode tentar). Você precisa chamar sudo com privilégios de root: sudo su.
su apenas alterna o usuário, fornecendo um shell normal com um ambiente quase igual ao do usuário anterior.
su - invoca um shell de login após alternar o usuário. Um shell de login redefine a maioria das variáveis de ambiente, fornecendo uma base limpa.
Recursos úteis:
Eles são essenciais para investigar problemas no sistema. O gerenciamento de logs é absolutamente crítico para a segurança de TI.
Servidores, firewalls e outros equipamentos de TI mantêm arquivos de log que registram eventos e transações importantes. Essas informações podem fornecer pistas importantes sobre atividade hostil que afeta sua rede de dentro e de fora. Os dados de log também podem fornecer informações para identificar e solucionar problemas de equipamentos, incluindo problemas de configuração e falhas de hardware.
É o registro do seu servidor de quem visitou seu site, quando e exatamente o que eles visualizaram. É incrivelmente detalhado, mostrando:
Fatores a considerar:
Ao coletar e analisar logs, você pode entender o que acontece dentro da sua rede. Cada arquivo de log contém muitas informações que podem ser inestimáveis, especialmente se você sabe como lê-los e analisá-los.
Recursos úteis:
Um backup incremental é um tipo de backup que copia apenas arquivos que foram alterados desde o backup anterior.
Recursos úteis:
Um RAID (Conjunto Redundante de Discos Independentes) é uma tecnologia usada para aumentar o desempenho e/ou a confiabilidade do armazenamento de dados.
Recursos úteis:
Se não for especificado, o comportamento do useradd dependerá da variável USERGROUPS_ENAB contida em /etc/login.defs. O comportamento padrão (USERGROUPS_ENAB yes) é criar um grupo com o mesmo nome do nome de usuário, com GID igual a UID.
Recursos úteis:
A ser completado.
Recursos úteis:
A ser completado.
As coisas mais importantes a entender sobre o modelo OSI (ou qualquer outro) são:
Recursos úteis:
VLANs e subnets resolvem problemas diferentes. VLANs trabalham na Camada 2, alterando assim os domínios de broadcast (por exemplo). Enquanto subnets são Camada 3 no contexto atual.
Subnet - é um intervalo de endereços IP determinado por parte de um endereço (frequentemente chamado de endereço de rede) e uma máscara de sub-rede (netmask). Por exemplo, se a máscara de sub-rede for 255.255.255.0 (ou /24 para simplificar) e o endereço de rede for 192.168.10.0, isso define um intervalo de endereços IP de 192.168.10.0 a 192.168.10.255. A abreviação para escrever isso é 192.168.10.0/24.
VLAN - uma boa maneira de pensar nisso é "particionamento de switch". Digamos que você tenha um switch de 8 portas que suporta VLAN. Você pode atribuir 4 portas a uma VLAN (digamos VLAN 1) e 4 portas a outra VLAN (digamos VLAN 2). A VLAN 1 não verá nenhum tráfego da VLAN 2 e vice-versa; logicamente, você agora tem dois switches separados. Normalmente, em um switch, se o switch não viu um endereço MAC, ele "inundará" o tráfego para todas as outras portas. impedem isso.
POP e IMAP são ambos protocolos para recuperar mensagens de um servidor de e-mail para um cliente de e-mail.
POP (Post Office Protocol) usa um push unidirecional do servidor de e-mail para o cliente. Por padrão, isso enviará mensagens para o cliente POP e as removerá do servidor de e-mail, embora seja possível configurar o servidor de e-mail para reter todas as mensagens. Quaisquer ações que você realizar na mensagem em seu cliente de e-mail (rotular, excluir, mover para uma pasta) não serão refletidas no servidor de e-mail e, portanto, serão inacessíveis a outros clientes de e-mail que puxam do servidor de e-mail. O POP usa pouco espaço de armazenamento no servidor de e-mail e pode ser visto como mais seguro, pois as mensagens existem apenas em um cliente de e-mail, em vez de no servidor de e-mail e em vários clientes.
IMAP (Internet Message Access Protocol) usa comunicação bidirecional entre servidor de e-mail e cliente. Excluir ou rotular uma mensagem em seu cliente de e-mail configurado com IMAP também excluirá ou rotulará a mensagem no servidor de e-mail. O IMAP permite uma experiência semelhante ao acessar e-mail em diferentes clientes ou dispositivos, pois as mensagens podem existir no mesmo estado em vários dispositivos. O IMAP também pode economizar espaço em disco no cliente de e-mail ao sincronizar seletivamente as mensagens, excluindo mensagens mais antigas do cliente de e-mail, já que pode sincronizá-las do servidor de e-mail mais tarde, conforme necessário.
Escolha IMAP se você precisar acessar mensagens em vários dispositivos e quiser economizar espaço em disco em seu dispositivo cliente. Escolha POP se quiser economizar espaço em disco em seu servidor de e-mail, acessar mensagens apenas de um dispositivo cliente e garantir que as mensagens não existam em vários sistemas.
Usando os comandos netstat -nr, route -n ou ip route show podemos ver a rota padrão e as tabelas de roteamento.
Recursos úteis:
Bem, a diferença mais provável é que você ainda precisa fazer uma consulta real de localhost em algum lugar.
Se você usar 127.0.0.1, o software (inteligente) simplesmente transformará isso diretamente em um endereço IP e o usará. Algumas implementações de gethostbyname detectarão o formato decimal (e presumivelmente o formato IPv6 equivalente) e não farão nenhuma consulta.
Caso contrário, o nome deve ser resolvido. E não há garantia de que seu arquivo hosts será realmente usado para essa resolução (primeiro, ou absolutamente), então localhost pode se tornar um endereço IP totalmente diferente.
Quero dizer que, em alguns sistemas, um arquivo hosts local pode ser ignorado. O arquivo host.conf controla isso no Linux (e em muitos outros Unices).
Se você usar um socket de domínio Unix, será um pouco mais rápido do que usar TCP/IP (devido à menor sobrecarga que você tem). O Windows usa TCP/IP como padrão, enquanto o Linux tenta usar um Socket de Domínio Unix se você escolher localhost e TCP/IP se usar 127.0.0.1.
Recursos úteis:
ping?ping usa ICMP, especificamente pacotes ICMP echo request e ICMP echo reply. Não há 'porta' associada ao ICMP. Portas estão associadas aos dois protocolos da camada de transporte IP, TCP e UDP. ICMP, TCP e UDP são "irmãos"; eles não são baseados uns nos outros, mas são três protocolos separados que rodam sobre IP.
Os pacotes ICMP são identificados pelo campo 'protocolo' no cabeçalho do datagrama IP. ICMP não utiliza serviços de comunicação UDP ou TCP, ele utiliza serviços de comunicação IP brutos. Isso significa que a mensagem ICMP é transportada diretamente no campo de dados do datagrama IP. raw (bruto) vem de como isso é implementado em software; para criar e enviar uma mensagem ICMP, abre-se um socket raw, constrói-se um buffer contendo a mensagem ICMP e, em seguida, escreve-se o buffer contendo a mensagem no socket raw.
O valor do protocolo IP para ICMP é 1. O campo protocolo faz parte do cabeçalho IP e identifica o que está na porção de dados do datagrama IP.
No entanto, você poderia usar nmap para ver se as portas estão abertas ou não:```bash
nmap -p 80 example.com
Recursos úteis:
- [Número da porta do ping](https://networkengineering.stackexchange.com/questions/42463/ping-port-number)
- [É possível pingar um endereço:porta?](https://superuser.com/questions/769541/is-it-possible-to-ping-an-addressport)
</details>
<details>
<summary><b>O Servidor A não consegue se comunicar com o Servidor B. Descreva possíveis razões em alguns passos.</b></summary><br>
Para solucionar problemas de comunicação entre servidores, é melhor seguir idealmente a pilha TCP/IP:
1. **Camada de Aplicação**: os serviços estão ativos e em execução em ambos os servidores? Eles estão configurados corretamente (por exemplo, vincular o IP e a porta corretos)? Os logs de aplicação e sistema mostram erros significativos?
2. **Camada de Transporte**: as portas usadas pela aplicação estão abertas (tente telnet!)? É possível pingar o servidor?
3. **Camada de Rede**: existe um firewall na rede ou no SO configurado corretamente? A pilha IP está configurada corretamente (IP, rotas, DNS, etc.)? Switches e roteadores estão funcionando (verifique a tabela ARP!)?
4. **Camada Física**: os servidores estão conectados a uma rede? Pacotes estão sendo perdidos?
</details>
<details>
<summary><b>Por que os nomes de host não resolvem no seu servidor? Corrija este problema. ***</b></summary><br>
A ser concluído.
</details>
<details>
<summary><b>Como resolver o nome de domínio (usando DNS externo) com CLI? IPs podem ser resolvidos para nomes de domínio?</b></summary><br>
Exemplos para resolver endereço IP para nome de domínio:```bash
# with host command:
host domain.com 8.8.8.8
# with dig command:
dig @9.9.9.9 google.com
# with nslookup command:
nslookup domain.com 8.8.8.8
telnet ou nc?nc -vz code42.example.com 5432
</details>
<details>
<summary><b>Por que você deve evitar o <code>telnet</code> para administrar um sistema remotamente?</b></summary><br>
Os sistemas operacionais modernos desativaram todos os serviços potencialmente inseguros por padrão. Por outro lado, alguns fornecedores de dispositivos de rede ainda permitem estabelecer comunicação usando o protocolo telnet.
**Telnet** usa o método mais inseguro para comunicação. Ele envia dados pela rede em formato de texto simples e qualquer pessoa pode facilmente descobrir a senha usando uma ferramenta de rede.
No caso do **Telnet**, isso inclui a passagem de credenciais de login em texto simples, o que significa que qualquer pessoa executando um sniffer na sua rede pode encontrar as informações necessárias para assumir o controle de um dispositivo em poucos segundos, bisbilhotando uma sessão de login **Telnet**.
Recursos úteis:
- [Telnet e SSH como alternativa segura](https://www.ssh.com/ssh/telnet)
- [Como telnet para um endereço IP em uma porta específica?](https://superuser.com/questions/339107/how-to-telnet-to-an-ip-address-on-a-specific-port)
</details>
<details>
<summary><b>Qual é a diferença entre <code>wget</code> e <code>curl</code>?</b></summary><br>
As principais diferenças são: o ponto forte do `wget` em comparação com o `curl` é sua capacidade de baixar recursivamente. O `wget` é apenas linha de comando. O `curl` suporta FTP, FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, LDAP, LDAPS, FILE, POP3, IMAP, SMTP, RTMP e RTSP.
Recursos úteis:
- [Qual é a diferença entre curl e wget? (original)](https://unix.stackexchange.com/questions/47434/what-is-the-difference-between-curl-and-wget)
</details>
<details>
<summary><b>O que é SSH e como funciona?</b></summary><br>
**SSH** significa **Secure Shell**. É um protocolo que permite a você ir de um servidor "A" para uma sessão shell em um servidor "B". Ele permite interagir com seu servidor "B".
Para que uma conexão **SSH** seja estabelecida, a máquina remota (servidor A) deve estar executando um software chamado daemon **SSH** e o computador do usuário (servidor B) deve ter um cliente **SSH**.
O daemon **SSH** e o cliente **SSH** ouvem conexões em uma porta de rede específica (porta 22 padrão), autenticam solicitações de conexão e iniciam o ambiente apropriado se o usuário fornecer as credenciais corretas.
Recursos úteis:
- [Entendendo o processo de criptografia e conexão SSH](https://www.digitalocean.com/community/tutorials/understanding-the-ssh-encryption-and-connection-process)
</details>
<details>
<summary><b>A maioria dos tutoriais sugere usar autenticação por chave SSH em vez de autenticação por senha. Por que é considerada mais segura?</b></summary><br>
Uma **chave SSH** é uma credencial de acesso no protocolo SSH. Sua função é semelhante à de nomes de usuário e senhas, mas as chaves são usadas principalmente para processos automatizados e para implementar single sign-on por administradores de sistema e usuários avançados.
Em vez de exigir a senha do usuário, é possível confirmar a identidade do cliente usando algoritmos de criptografia assimétrica, com chaves pública e privada.
Se seu serviço SSH permitir apenas autenticação por chave pública, um invasor precisará de uma cópia de uma chave privada correspondente a uma chave pública armazenada no servidor.
Se seu serviço SSH permitir autenticação baseada em senha, então seu servidor SSH conectado à Internet será bombardeado dia e noite por botnets tentando adivinhar nomes de usuário e senhas. O botnet não precisa de informações; ele pode apenas tentar nomes populares e senhas populares. Além de outras coisas, isso entope seus logs.
Recursos úteis:
- [Autenticação Baseada em Chave (Autenticação por Chave Pública)](http://www.crypto-it.net/eng/tools/key-based-authentication.html)
- [Senha SSH vs. autenticação por chave](https://security.stackexchange.com/questions/33381/ssh-password-vs-key-authentication)
</details>
<details>
<summary><b>O que é um filtro de pacotes e como funciona?</b></summary><br>
**Filtragem de pacotes** é uma técnica de firewall usada para controlar o acesso à rede monitorando pacotes de saída e entrada e permitindo que eles passem ou parem com base nos endereços IP de origem e destino, protocolos e portas.
A filtragem de pacotes é apropriada onde há requisitos de segurança modestos. As redes internas (privadas) de muitas organizações não são altamente segmentadas. Firewalls altamente sofisticados não são necessários para isolar uma parte da organização de outra.
No entanto, é prudente fornecer algum tipo de proteção da rede de produção de uma rede de laboratório ou experimental. Um dispositivo de filtragem de pacotes é uma medida muito apropriada para fornecer isolamento de uma sub-rede de outra.
Operando na camada de rede e na camada de transporte da pilha de protocolos TCP/IP, cada pacote é examinado à medida que entra na pilha de protocolos. Os cabeçalhos de rede e transporte são examinados de perto para as seguintes informações:
- **protocolo (cabeçalho IP, camada de rede)** - no cabeçalho IP, o byte 9 (lembre-se de que a contagem de bytes começa em zero) identifica o protocolo do pacote. A maioria dos dispositivos de filtro tem a capacidade de diferenciar entre TCP, UDP e ICMP.
- **endereço de origem (cabeçalho IP, camada de rede)** - o endereço de origem é o endereço IP de 32 bits do host que criou o pacote.
- **endereço de destino (cabeçalho IP, camada de rede)** - o endereço de destino é o endereço IP de 32 bits do host para o qual o pacote é destinado.
- **porta de origem (cabeçalho TCP ou UDP, camada de transporte)** - cada extremidade de uma conexão de rede TCP ou UDP está vinculada a uma porta. As portas TCP são separadas e distintas das portas UDP. As portas numeradas abaixo de 1024 são reservadas – elas têm um uso especificamente definido. As portas numeradas acima de 1024 (inclusive) são conhecidas como portas efêmeras. Elas podem ser usadas como o fornecedor escolher. Para uma lista de portas "bem conhecidas", consulte RFP1700. A porta de origem é um número de porta efêmera pseudoaleatório. Portanto, muitas vezes não é muito útil filtrar pela porta de origem.
- **porta de destino (cabeçalho TCP ou UDP, camada de transporte)** - o número da porta de destino indica uma porta para a qual o pacote é enviado. Cada serviço no host de destino escuta em uma porta. Algumas portas bem conhecidas que podem ser filtradas são 20/TCP e 21/TCP - conexão/dados ftp, 23/TCP - telnet, 80/TCP - http e 53/TCP - transferências de zona DNS.
- **status da conexão (cabeçalho TCP, camada de transporte)** - o status da conexão informa se o pacote é o primeiro pacote da sessão de rede. O bit ACK no cabeçalho TCP é definido como "falso" ou 0 se este for o primeiro pacote da sessão. É simples impedir que um host estabeleça uma conexão, rejeitando ou descartando qualquer pacote que tenha o bit ACK definido como "falso" ou 0.
Recursos úteis:
- [Construindo Firewalls de Internet - Filtragem de Pacotes](http://web.deu.edu.tr/static/oreily/networking/firewall/ch06_01.htm)
</details>
<details>
<summary><b>Quais são as vantagens de usar um servidor proxy reverso?</b></summary><br>
**Ocultar a topologia e as características de seus servidores back-end**
O **servidor proxy reverso** pode ocultar a presença e as características do servidor de origem. Ele atua como um intermediário entre a nuvem da internet e o servidor web. É bom por questões de segurança, especialmente quando você está usando serviços de hospedagem web.
**Permite manutenção transparente de servidores backend**
As alterações que você fizer nos servidores executados atrás de um proxy reverso serão completamente transparentes para seus usuários finais.
**Balanceamento de carga**
O proxy reverso aplicará um algoritmo de balanceamento de carga como round robin, round robin ponderado, menos conexões, menos conexões ponderadas ou aleatório, para distribuir a carga entre os servidores no cluster.
Quando um servidor cai, o sistema automaticamente faz failover para o próximo servidor ativo e os usuários podem continuar com suas atividades de transferência segura de arquivos.
**Offloading/terminação SSL**
Lida com conexões HTTPS de entrada, descriptografando as solicitações e passando solicitações não criptografadas para os servidores web.
**Mascaramento de IP**
Usando um único IP, mas URLs diferentes para rotear para diferentes servidores back-end.
Recursos úteis:
- [Os Benefícios de um Proxy Reverso](https://dzone.com/articles/benefits-reverse-proxy)
</details>
<details>
<summary><b>Qual é a diferença entre um roteador e um gateway? O que é o gateway padrão?</b></summary><br>
**Roteador** descreve a função técnica geral (encaminhamento de camada 3) ou um dispositivo de hardware destinado a esse propósito, enquanto gateway descreve a função para o segmento local (fornecendo conectividade para outro lugar). Você também poderia afirmar que "_você configura um roteador como gateway_". Outro termo é hop, que descreve o encaminhamento entre sub-redes.
O termo **gateway padrão** é usado para se referir ao roteador em sua LAN que tem a responsabilidade de ser o primeiro ponto de contato para o tráfego destinado a computadores fora da LAN.
É apenas uma questão de perspectiva; o dispositivo é o mesmo.
Recursos úteis:
- [Diferença entre roteador e gateway (original)](https://networkengineering.stackexchange.com/questions/51426/difference-between-router-and-gateway)
</details>
<details>
<summary><b>Explique a função de cada um dos seguintes registros DNS: SOA, PTR, A, MX e CNAME.</b></summary><br>
**Registros DNS** são basicamente arquivos de mapeamento que informam ao servidor DNS qual endereço IP cada domínio está associado e como lidar com solicitações enviadas a cada domínio. Algumas sintaxes de **registros DNS** comumente usadas em quase todas as configurações de registro DNS são `A`, `AAAA`, `CNAME`, `MX`, `PTR`, `NS`, `SOA`, `SRV`, `TXT` e `NAPTR`.
- **SOA** - Start Of Authority (Início de Autoridade)
- **A** - Registros de Mapeamento de Endereço
- **AAAA** - Registros de Endereço IPv6
- **CNAME** - Registros de Nome Canônico
- **MX** - Registro de troca de correio
- **NS** - Registros de Servidor de Nomes
- **PTR** - Registros de Ponteiro de Consulta Reversa
Recursos úteis:
- [Lista de tipos de registros DNS](https://en.wikipedia.org/wiki/List_of_DNS_record_types)
</details>
<details>
<summary><b>Por que os endereços MAC não poderiam ser usados em vez de IPv4/6 para rede?</b></summary><br>
O modelo **OSI** explica por que não faz sentido tomar decisões de roteamento, um conceito de **camada 3**, com base em um mecanismo físico, **camada 2**.
A rede moderna é dividida em muitas camadas diferentes para realizar sua comunicação de ponta a ponta. Sua placa de rede (o que é endereçado pelo endereço MAC - endereço físico) precisa ser responsável apenas pela comunicação com pares em sua rede física.
A comunicação que você pode realizar com seu endereço **MAC** será limitada a outros dispositivos que residem em contato físico com sua máquina. Na internet, por exemplo, você não está fisicamente conectado a cada máquina. É por isso que usamos o mecanismo **TCP/IP** (um endereço lógico de **camada 3**) quando precisamos nos comunicar com uma máquina à qual não estamos fisicamente conectados.
**IP** é um esquema de numeração arbitrário imposto de forma hierárquica a um grupo de computadores para distingui-los logicamente como um grupo (isso é o que é uma sub-rede). O envio de mensagens entre esses grupos é feito por tabelas de roteamento, elas próprias divididas em vários níveis para que não tenhamos que acompanhar cada sub-rede individual.
Também é bastante fácil relacionar isso a outro par de sistemas. Você tem um Número de Identificação emitido pelo Estado; por que você precisaria de um endereço postal se esse número de identificação já é único para você? Você precisa do endereço postal porque é um sistema arbitrário que descreve onde o destino único para comunicações para você deve ir.
Por outro lado, a distribuição de endereços **MAC** pela rede é aleatória e completamente não relacionada à topologia. O agrupamento de rotas seria impossível; todo roteador precisaria manter o controle de rotas para cada dispositivo que encaminha tráfego através dele. Isso é o que os switches de **camada 2** fazem, e isso não escala bem além de um certo número de hosts.
Recursos úteis:
- [Por que os endereços MAC não poderiam ser usados em vez de IPv4|6 para rede? (original)](https://serverfault.com/questions/410626/why-couldnt-mac-addresses-be-used-instead-of-ipv46-for-networking)
</details>
<details>
<summary><b>Qual é a menor máscara de sub-rede IPv4 que pode ser aplicada a uma rede contendo até 30 dispositivos?</b></summary><br>
Se você tem uma VLAN `/24` padrão para usuários finais, uma `/30` para links ponto a ponto, ou algo intermediário, a sub-rede que deve conter até 30 dispositivos resulta em uma `/27` - ou uma máscara de sub-rede de `255.255.255.224`.
Recursos úteis:
- [Como calcular o prefixo, rede, sub-rede e números de host?](https://networkengineering.stackexchange.com/questions/7106/how-do-you-calculate-the-prefix-network-subnet-and-host-numbers)
- [A barra após um endereço IP - Notação CIDR](https://networkengineering.stackexchange.com/questions/3697/the-slash-after-an-ip-address-cidr-notation)
- [Por que existem 3 faixas de endereços IPv4 privados?](https://networkengineering.stackexchange.com/questions/32119/why-are-there-3-ranges-of-private-ipv4-addresses)
- [Calculadora IP](http://jodies.de/ipcalc)
</details>
<details>
<summary><b>Quais são alguns códigos de status HTTP comuns?</b></summary><br>
- **1xx** - Respostas informativas - comunica informações de nível de protocolo de transferência
- **2xx** - Sucesso - indica que a solicitação do cliente foi aceita com sucesso
- **3xx** - Redirecionamento - indica que o cliente deve tomar alguma ação adicional para completar sua solicitação
- **4xx** - Erro do lado do cliente - esta categoria de códigos de status de erro aponta o dedo para os clientes
- **5xx** - Erro do lado do servidor - o servidor assume a responsabilidade por esses códigos de status de erro
Recursos úteis:
- [Códigos de Status HTTP](https://httpstatuses.com/)
</details>
###### Perguntas de DevOps (5)
<details>
<summary><b>O que é DevOps? O que é mais importante para o sucesso de qualquer comunidade DevOps: como as pessoas se comunicam ou as ferramentas que você escolhe para implantar? ***</b></summary><br>
**DevOps** é uma equipe coesa que se envolve em tarefas de Desenvolvimento e Operações, ou são equipes individuais de Operações e Desenvolvimento que trabalham muito próximas. É mais uma "forma" de trabalhar colaborativamente com outros departamentos para alcançar objetivos comuns.
</details>
<details>
<summary><b>O que é um controle de versão? Suas mensagens de commit são bonitas?</b></summary><br>
É um sistema que registra alterações em um arquivo ou conjunto de arquivos ao longo do tempo para que você possa recuperar versões específicas posteriormente. Os sistemas de controle de versão consistem em um repositório central compartilhado onde os colegas de equipe podem confirmar alterações em um arquivo ou conjunto de arquivos. Então você pode mencionar os usos do controle de versão.
O controle de versão permite que você:
- reverta arquivos para um estado anterior
- reverta o projeto inteiro para um estado anterior
- compare mudanças ao longo do tempo
- veja quem modificou algo pela última vez que pode estar causando um problema
- veja quem introduziu um problema e quando
As sete regras de uma ótima mensagem de commit:
- separe o assunto do corpo com uma linha em branco
- limite a linha de assunto a 50 caracteres
- capitalize a linha de assunto
- não termine a linha de assunto com um ponto
- use o modo imperativo na linha de assunto
- quebre o corpo em 72 caracteres
- use o corpo para explicar o quê e porquê vs. como
Recursos úteis:
- [Começando - Sobre Controle de Versão (original)](https://git-scm.com/book/en/v2/Getting-Started-About-Version-Control)
</details>
<details>
<summary><b>Explique alguns comandos básicos do <code>git</code>.</b></summary><br>
- `git init` - cria um novo repositório local
- `git commit -m "mensagem"` - confirma mudanças no head
- `git status` - lista os arquivos que você adicionou com `git add` e também confirma quaisquer arquivos que você alterou desde então
- `git push origin master` - envia mudanças para o branch master do seu repositório remoto
</details>
<details>
<summary><b>Explique um pipeline simples de Integração Contínua.</b></summary><br>
- clonar repositório
- estágio de implantação (QA)
- ambiente de teste (QA)
- estágio de implantação (PROD)
</details>
<details>
<summary><b>Explique alguns comandos básicos do <code>docker</code>.</b></summary><br>
- `docker ps` - mostra contêineres em execução
- `docker ps -a` - mostra todos os contêineres
- `docker images` - mostra imagens docker
- `docker logs <id-do-contêiner|nome-do-contêiner>` - obtém logs do contêiner
- `docker network ls` - mostra todas as redes docker
- `docker volumes ls` - mostra todos os volumes docker
- `docker exec -it <id-do-contêiner|nome-do-contêiner> bash` - executa bash no contêiner com shell interativo
</details>
###### Perguntas de Segurança Cibernética (1)
<details>
<summary><b>O que é uma Configuração Incorreta de Segurança?</b></summary><br>
**Configuração incorreta de segurança** é uma vulnerabilidade quando um dispositivo/aplicação/rede é configurado de uma forma que pode ser explorada por um invasor para tirar proveito dela. Isso pode ser tão simples quanto deixar o nome de usuário/senha padrão inalterados ou muito simples para contas de dispositivos, etc.
</details>
### :diamond_shape_with_a_dot_inside: <a name="regular-sysadmin">Sysadmin Regular</a>
###### Perguntas sobre Sistema (60)
<details>
<summary><b>Conte-me sobre sua experiência com ambientes de produção? ***</b></summary><br>
A ser preenchido.
</details>
<details>
<summary><b>Qual distribuição você escolheria para executar um servidor web importante? ***</b></summary><br>
A ser preenchido.
</details>
<details>
<summary><b>Explique em alguns pontos o processo de inicialização do sistema Linux.</b></summary><br>
**BIOS**: O nome completo do BIOS é Basic Input or Output System (Sistema Básico de Entrada ou Saída) que realiza verificações de integridade e irá procurar, carregar e então executar o bootloader.
**Bootloader**: Como as fases anteriores não são específicas do sistema operacional, o processo de inicialização baseado em BIOS para arquiteturas x86 e x86-64 é considerado iniciado quando o código do master boot record (MBR) é executado em modo real e o bootloader de primeiro estágio é carregado. Em sistemas UEFI, uma carga útil, como o kernel Linux, pode ser executada diretamente. Portanto, nenhum bootloader é necessário. Alguns bootloaders populares: **GRUB**, **Syslinux/Isolinux** ou **Lilo**.
**Kernel**: O kernel no Linux lida com todos os processos do sistema operacional, como gerenciamento de memória, agendamento de tarefas, I/O, comunicação entre processos e controle geral do sistema. Ele é carregado em duas etapas - na primeira etapa, o kernel (como um arquivo de imagem compactado) é carregado na memória e descompactado, e algumas funções fundamentais, como gerenciamento básico de memória, são configuradas.
**Init**: É o pai de todos os processos no sistema; é executado pelo kernel e é responsável por iniciar todos os outros processos.
- `SysV init` - o trabalho do init é "fazer tudo funcionar como deveria uma vez que o kernel esteja totalmente em execução". Essencialmente, ele estabelece e opera todo o espaço do usuário. Isso inclui verificar e montar sistemas de arquivos, iniciar serviços de usuário necessários e, finalmente, mudar para um ambiente de usuário quando a inicialização do sistema é concluída.
- `systemd` - os desenvolvedores do systemd tinham como objetivo substituir o sistema init do Linux herdado do Unix System V. Como o init, o systemd é um daemon que gerencia outros daemons. Todos os daemons, incluindo o systemd, são processos em segundo plano. O systemd é o primeiro daemon a iniciar (durante a inicialização) e o último daemon a terminar (durante o desligamento).
- `runinit` - runinit é um esquema init para sistemas operacionais tipo Unix que inicializa, supervisiona e encerra processos em todo o sistema operacional. É uma reimplementação do kit de ferramentas de supervisão de processos daemontools que funciona nos sistemas operacionais Linux, Mac OS X, \*BSD e Solaris.
Recursos úteis:
- [Analisando o processo de inicialização do Linux](https://opensource.com/article/18/1/analyzing-linux-boot-process)
- [Processo de inicialização do Systemd: um olhar detalhado no Linux](https://linoxide.com/linux-how-to/systemd-boot-process/)
</details>
<details>
<summary><b>Como e por que os daemons do Linux reduzem privilégios? Por que alguns daemons precisam de permissões root para iniciar? Explique. ***</b></summary>
A ser preenchido.
</details>
<details>
<summary><b>Por que uma carga de 1,00 não é ideal em uma máquina single-core?</b></summary><br>O problema com uma carga de 1,00 é que não há margem de manobra. Na prática, muitos administradores de sistema traçam um limite em 0,70.
**Regra de ouro "Precisa investigar":** 0,70. Se sua média de carga permanecer acima de > 0,70, é hora de investigar antes que as coisas piorem.
**Regra de ouro "Conserte isso agora":** 1,00. Se sua média de carga permanecer acima de 1,00, encontre o problema e conserte-o imediatamente. Caso contrário, você será acordado no meio da noite, e não será divertido.
**Regra de ouro:** 5,0. Se sua média de carga estiver acima de 5,00, você pode estar com sérios problemas; sua máquina pode estar travando ou ficando muito lenta, e isso (inexplicavelmente) acontecerá no pior momento possível, como no meio da noite ou quando você estiver apresentando em uma conferência. Não deixe chegar a esse ponto.
Recursos úteis:
- [Proper way of interpreting system load on a 4 core 8 thread processor](https://serverfault.com/questions/618130/proper-way-of-interpreting-system-load-on-a-4-core-8-thread-processor)
- [Understanding Linux CPU Load - when should you be worried?](http://blog.scoutapp.com/articles/2009/07/31/understanding-load-averages)
</details>
<details>
<summary><b>O que significa quando o usuário efetivo é root, mas o ID de usuário real ainda é o seu nome?</b></summary><br>
O **ID de usuário real** é quem você realmente é (o usuário que possui o processo), e o **ID de usuário efetivo** é o que o sistema operacional verifica para decidir se você tem permissão para fazer algo (na maioria das vezes, há algumas exceções).
Quando você faz login, o shell de login define tanto o **ID de usuário real quanto o efetivo** para o mesmo valor (seu **ID de usuário real**) conforme fornecido pelo arquivo de senhas.
Se, por exemplo, você executa setuid, e além de executar como outro usuário (por exemplo, **root**), o programa setuid também deve fazer algo em seu nome.
Após executar setuid, ele terá seu **ID real** (já que você é o proprietário do processo) e o ID de usuário efetivo do proprietário do arquivo (por exemplo, **root**) já que é setuid.
Vamos usar o caso do `passwd`:```bash
-rwsr-xr-x 1 root root 45396 may 25 2012 /usr/bin/passwd
Usar o logrotate é a forma habitual de lidar com ficheiros de log. Mas em vez de adicionar conteúdo ao /etc/logrotate.conf, deve adicionar a sua própria tarefa em /etc/logrotate.d/, caso contrário teria que analisar mais diferenças nos ficheiros de configuração durante as atualizações de versão.
Se o ficheiro está a ser ativamente escrito, não há muito que possa fazer para o truncar. As suas únicas opções são truncar o ficheiro:```bash : >/var/log/massive-logfile
É muito útil, pois trunca o ficheiro sem interromper os processos.
Recursos úteis:
- [How to Use logrotate to Manage Log Files](https://www.linode.com/docs/uptime/logs/use-logrotate-to-manage-log-files/)
- [System logging](https://www.ibm.com/developerworks/library/l-lpic1-108-2/index.html)
</details>
<details>
<summary><b>Como é que o kernel do Linux cria, gere e elimina os processos no sistema? ***</b></summary><br>
Por preencher.
Recursos úteis:
- [Linux Processes](https://www.tldp.org/LDP/tlk/kernel/processes.html)
</details>
<details>
<summary><b>Explique a informação selecionada que pode ver em <code>top</code> e <code>htop</code>. Como diagnosticar problemas de carga, tempo de utilizador elevado e falta de memória com estas ferramentas? ***</b></summary><br>
Por preencher.
Recursos úteis:
- [top explained visually](https://www.svennd.be/top-explained-visually/)
- [htop Explained Visually](https://codeahoy.com/2017/01/20/hhtop-explained-visually/)
- [Explanation of everything you can see in htop/top on Linux](https://peteris.rocks/blog/htop/)
</details>
<details>
<summary><b>Como reconheceria um processo que está a consumir muitos recursos? </b></summary><br>
`top` funciona razoavelmente bem, desde que olhe para os números certos.
- **M** Ordena pela utilização atual de memória residente
- **T** Ordena pela utilização total (ou cumulativa) de CPU
- **P** Ordena pela utilização atual de CPU (esta é a atualização predefinida)
- **?** Mostra um resumo de utilização para todos os comandos top
Esta é uma informação muito importante para obter quando se está a resolver problemas de lentidão de um processo informático e a tomar decisões sobre que processos matar/software desinstalar.
Recursos úteis:
- [How to find the process(es) which are hogging the machine](https://superuser.com/questions/326300/how-to-find-the-processes-which-are-hogging-the-machine)
</details>
<details>
<summary><b>Precisa de atualizar o serviço <code>ntpd</code> em 200 servidores. Qual é a melhor forma de atualizar todos para a versão mais recente?</b></summary><br>
Usando a abordagem **Infrastructure as a Code**, existem várias boas formas:
1. **Modelo de Gestão de Mudanças por Sincronização de Configuração**:
Existem Ferramentas de Gestão de Configuração (Ansible, Chef, Puppet, Saltstack, ...), que podem ser utilizadas para atualizar automaticamente o serviço `ntpd` em todos os servidores. Para manter os sistemas estáveis, os pacotes de sistema nos servidores são geralmente atualizados automaticamente apenas com atualizações de segurança. Versões maiores ou menores de pacotes são geralmente bloqueadas por versão nas definições de configuração para evitar má configuração do serviço. A mudança é então implementada alterando a versão do `ntpd` na definição de configuração.
Com esta abordagem, é importante ter cuidado ao implementar mudanças na infraestrutura em massa. O pipeline de implementação deve incluir testes unitários, de integração e de sistema, e eventualmente ser primeiramente implementado no ambiente de Staging para comprovar a configuração. Se os testes provarem a correção da configuração, a implementação deve ser feita através de um rollout incremental com capacidade de reverter em caso de erros ou falhas.
2. **Modelo de Servidores Imutáveis**:
No modelo de Servidor Imutável, a unidade completa (servidor, contentor) é substituída por uma nova imagem atualizada em vez de fazer alterações ao servidor em execução (isto elimina o desvio de configuração). Com esta abordagem, normalmente constrói-se a imagem do servidor com ferramentas como Packer ou Docker com Dockerfile. Esta imagem é então testada e implementada de forma semelhante à opção acima (1.), mas agora usando técnicas como Canary Release, que também tem capacidade de rollout incremental e reversão.
Recursos úteis:
- [Infrastructure as a Code - Chapter 8: Patterns for Updating and Changing Servers](http://shop.oreilly.com/product/0636920039297.do)
</details>
<details>
<summary><b>Como definir permanentemente o <code>$PATH</code> no Linux/Unix? Porque é que esta variável é tão importante? ***</b></summary>
Por preencher.
</details>
<details>
<summary><b>Quando o seu servidor está a arrancar, alguns erros aparecem na consola. Como examinar as mensagens de boot e onde estão armazenadas?</b></summary><br>
A sua consola tem dois tipos de mensagens:
- **geradas pelo kernel** (via printk)
- **geradas pelo userspace** (geralmente o seu sistema init)
As mensagens do kernel estão sempre armazenadas no buffer **kmsg**, visível através do comando `dmesg`. Também são frequentemente copiadas para o seu **syslog**. Isto também se aplica a mensagens do userspace escritas em `/dev/kmsg`, mas essas são bastante raras.
Entretanto, quando o userspace escreve o seu elegante texto de estado de boot em `/dev/console` ou `/dev/tty1`, não é armazenado em lado nenhum. Vai apenas para o ecrã e é isso.
`dmesg` é usado para rever as mensagens de boot contidas no ring buffer do kernel. Um ring buffer é um buffer de tamanho fixo onde qualquer novo dado adicionado sobrescreve o dado mais antigo.
Mostra operações assim que o processo de boot é concluído, como opções de linha de comando passadas ao kernel; componentes de hardware detetados, eventos quando um novo dispositivo USB é adicionado, ou erros como falha da NIC (Network Interface Card) e os drivers reportam que não foi detetada atividade de ligação na rede e muito mais.
Se o registo do sistema for feito através do componente journal, deve usar `journalctl`. Este mostra mensagens que incluem mensagens do kernel e de boot; mensagens do syslog ou de vários serviços.
Problemas/erros de boot obrigam um administrador de sistemas a consultar certos ficheiros importantes em conjunto com comandos específicos (tratados de forma diferente por diferentes versões do Linux):
- `/var/log/boot.log` - log de boot do sistema, contém tudo o que aconteceu durante o boot do sistema
- `/var/log/messages` - armazena mensagens globais do sistema, incluindo as mensagens registadas durante o boot do sistema
- `/var/log/dmesg` - contém informação do ring buffer do kernel
Recursos úteis:
- [How to view all boot messages in Linux after booting? (original)](https://superuser.com/questions/1188407/how-to-view-all-boot-messages-in-linux-after-booting)
- [Differences in /var/log/{syslog,dmesg,messages} log files](https://superuser.com/questions/565927/differences-in-var-log-syslog-dmesg-messages-log-files)
- [How can the messages that scroll by when booting a Debian system be reviewed later?](https://serverfault.com/questions/516411/all-debian-boot-messages)
</details>
<details>
<summary><b>A utilização de swap está demasiado alta. Quais são as razões para isso e como resolver problemas de swapping?</b></summary><br>
O espaço **Swap** é uma quantidade restrita de memória física alocada para uso pelo sistema operativo quando a memória disponível está totalmente utilizada. É uma gestão de memória que envolve a troca de secções de memória de e para o armazenamento físico.
Se o sistema precisar de mais recursos de memória e a RAM estiver cheia, as páginas inativas na memória são movidas para o espaço de swap. Embora o espaço de swap possa ajudar máquinas com pouca RAM, não deve ser considerado um substituto para mais RAM. O espaço **Swap** está localizado em discos rígidos, que têm um tempo de acesso mais lento do que a memória física.
A carga de trabalho aumenta a sua procura por RAM. Está a executar uma carga de trabalho que requer mais memória. A utilização total do swap indica isso. Além disso, alterar `swappiness` para **1** pode não ser uma decisão sábia. Definir `swappiness` para **1** não indica que o swapping não será feito. Apenas indica quão agressivo o kernel será em relação ao swapping, não elimina o swapping. O swapping acontecerá se for necessário.
- **Aumentar o tamanho do espaço de swap** - primeiro, teria um aumento do uso do disco. Se os seus discos não forem suficientemente rápidos para acompanhar, o seu sistema pode acabar em thrashing, e experimentaria lentidões à medida que os dados são trocados de e para a memória. Isto resultaria num gargalo.
- **Adicionar mais RAM** - a verdadeira solução é adicionar mais memória. Não há substituto para a RAM, e se tiver memória suficiente, fará menos swapping.
Para monitorizar a utilização do espaço de swap:
- `cat /proc/swaps` - para ver o tamanho total e usado de swap
- `grep SwapTotal /proc/meminfo` - para mostrar o espaço total de swap
- `free` - para mostrar a quantidade de memória livre e usada do sistema (incluindo swap)
- `vmstat` - para verificar estatísticas de swapping
- `top`, `htop` - para verificar a utilização do espaço de swap
- `atop` - para mostrar se o seu sistema está a overcommitar memória
- ou use um comando shell one-liner para listar todas as aplicações com quanto espaço de swap estão a usar em kilobytes:```bash
for _fd in /proc/*/status ; do
awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $_fd
done | sort -k 2 -n -r | less
No Linux e outros sistemas operacionais tipo Unix, novos arquivos são criados com um conjunto padrão de permissões. Especificamente, as permissões de um novo arquivo podem ser restritas de uma maneira específica aplicando uma "máscara" de permissões chamada umask. O comando umask é usado para definir essa máscara, ou para mostrar seu valor atual.
Para alterar permanentemente (definir, por exemplo, umask 02):
~/.profile~/.bashrc~/.zshrc~/.cshrcRecursos úteis:
No sistema de arquivos, os arquivos são representados por inodes (ou são vários inodes, não sei ao certo).
Quando você exclui um arquivo, ele remove um link para o inode subjacente. O inode só é excluído (ou passível de exclusão/sobrescrita) quando todos os links para o inode forem excluídos.
Uma vez que um hard link tenha sido criado, o link é para o inode. Excluir, renomear ou mover o arquivo original não afetará o hard link, pois ele está vinculado ao inode subjacente. Quaisquer alterações nos dados do inode são refletidas em todos os arquivos que referenciam esse inode.
Nota: Hard links são válidos apenas dentro do mesmo sistema de arquivos. Links simbólicos podem abranger sistemas de arquivos, pois são simplesmente o nome de outro arquivo.
Diferenças:
Recursos úteis:
SUID/GUID é o mesmo?Esta é provavelmente uma das coisas mais irritantes que as pessoas erram o tempo todo. O SUID/GUID e o sticky-bit são duas coisas completamente diferentes.
Se você executar man chmod, poderá ler sobre o SUID e o sticky-bit.
SUID/GUID
O que a página de manual acima está tentando dizer é que a posição que o bit x ocupa no rwxrwxrwx para o octal do usuário (1º grupo de rwx) e o octal do grupo (2º grupo de rwx) pode assumir um estado adicional onde o x se torna um s. Quando isso ocorre, este arquivo, quando executado (se for um programa e não apenas um script de shell), será executado com as permissões do proprietário ou do grupo do arquivo.
Portanto, se o arquivo pertence a root e o bit SUID estiver ativado, o programa será executado como root. Mesmo se você o executar como um usuário comum. O mesmo se aplica ao bit GUID.
Exemplos:
sem suid/guid - apenas os bits rwxr-xr-x estão definidos.```bash
ls -lt b.pl
-rwxr-xr-x 1 root root 179 Jan 9 01:01 b.pl
**suid e bit executável do usuário ativado (s minúsculo)** - os bits `rwsr-x-r-x` estão definidos.```bash
chmod u+s b.pl
ls -lt b.pl
-rwsr-xr-x 1 root root 179 Jan 9 01:01 b.pl
suid ativado & bit executável desativado (S maiúsculo) - os bits rwSr-xr-x estão definidos.```bash
chmod u-x b.pl
ls -lt b.pl
-rwSr-xr-x 1 root root 179 Jan 9 01:01 b.pl
**guid & bit executável do grupo ativado (s minúsculo)** - os bits `rwxr-sr-x` estão definidos.```bash
chmod g+s b.pl
ls -lt b.pl
-rwxr-sr-x 1 root root 179 Jan 9 01:01 b.pl
LC_ALL=C antes de um comando faz? Em que casos será útil?LC_ALL é a variável de ambiente que substitui todas as outras configurações de localização. Isso define todas as variáveis do tipo LC_ de uma só vez para uma localidade especificada.
A principal razão para definir LC_ALL=C antes do comando é que é bom para simplesmente obter saída em inglês (alterar geralmente a localidade usada pelo comando).
Por outro lado, também é importante aumentar a velocidade de execução do comando com LC_ALL=C, por exemplo, grep ou fgrep. Usar a localidade LC_ALL=C aumentou nosso desempenho e reduziu o tempo de execução do comando.
Por exemplo, se você definir LC_ALL=en_US.utf8, seu sistema abre vários arquivos do diretório /usr/lib/locale. Para LC_ALL=C, uma quantidade mínima de operações de abertura e leitura é realizada.
Se você quiser restaurar todas as suas configurações normais (originais) de localidade para a sessão:```bash LC_ALL=
A ser completado.
1) Requisitos principais - lembre-se disso
/var/www/app01/htmlumask para usuários e suid/sgid (apenas para situações específicas)2) Diretórios do aplicativo
/var/www contém um diretório para cada site (isolamento dos aplicativos), ex. /var/www/app01, `/var/www/app02````bash
mkdir /var/www/{app01,app02}
**3) Proprietário e grupo da aplicação**
Cada aplicação tem um **proprietário** designado (por exemplo, **u01-prod**, **u02-prod**) e um **grupo** (por exemplo, **g01-prod**, **g02-prod**) que são definidos como proprietário de todos os arquivos e diretórios no diretório do site:```bash
chown -R u01-prod:g01-prod /var/www/app01
chown -R u02-prod:g02-prod /var/www/app02
4) Proprietários e grupo dos desenvolvedores
Todos os usuários que mantêm o site têm seus próprios grupos e estão vinculados ao grupo da aplicação:```bash id alice uid=2000(alice) gid=4000(alice) groups=8000(g01-prod) id bob uid=2001(bob) gid=4001(bob) groups=8000(g01-prod),8001(g02-prod)
Para definir os parâmetros do kernel em sistemas Unix-like, primeiro edite o arquivo /etc/sysctl.conf, após fazer as alterações salve o arquivo e execute o comando sysctl -p. Este comando aplicará as alterações de forma permanente sem reiniciar a máquina.
Recursos úteis:
/proc./proc é um sistema de arquivos virtual que fornece informações detalhadas sobre o kernel, hardware e processos em execução.
Como /proc contém arquivos virtuais, é chamado de sistema de arquivos virtual. Esses arquivos virtuais têm qualidades únicas. A maioria deles é listada com tamanho zero bytes.
Arquivos virtuais como /proc/interrupts, /proc/meminfo, /proc/mounts e /proc/partitions fornecem uma visão atualizada do hardware do sistema. Outros: o arquivo /proc/filesystems e o diretório /proc/sys/ fornecem informações de configuração do sistema e interfaces.
Recursos úteis:
A ser concluído.
Existem três tipos de journaling disponíveis nos sistemas de arquivos ext3/ext4:
Um inode é uma estrutura de dados em um sistema de arquivos no Linux e em outros sistemas operacionais Unix-like que armazena todas as informações sobre um arquivo, exceto seu nome e seus dados reais. Uma estrutura de dados é uma forma de armazenar dados para que possam ser usados eficientemente.
Um arquivo Unix é armazenado em duas partes diferentes do disco - os blocos de dados e os inodes. Não entrarei em superblocos e outras informações esotéricas. Os blocos de dados contêm os "conteúdos" do arquivo. As informações sobre o arquivo são armazenadas em outro lugar - no inode.
O número do inode de um arquivo pode ser facilmente encontrado usando o comando ls, que por padrão lista os objetos (ou seja, arquivos, links e diretórios) no diretório atual (ou seja, o diretório no qual o usuário está trabalhando no momento), com sua opção -i. Assim, por exemplo, o seguinte mostrará o nome de cada objeto no diretório atual juntamente com seu número de inode:```bash
ls -i
`df's` `-i` opção instrui-o a fornecer informações sobre inodes em cada sistema de arquivos em vez de sobre espaço disponível. Especificamente, diz ao df para retornar, para cada sistema de arquivos montado, o número total de inodes, o número de inodes livres, o número de inodes usados e a porcentagem de inodes usados. Esta opção pode ser usada em conjunto com a opção `-h` da seguinte forma para tornar a saída mais fácil de ler:```bash
df -hi
Encontrar arquivos por inodes
Se você conhece o inode, pode encontrá-lo usando o comando find:
find . -inum 435304 -print
```
**Eliminando arquivos com nomes estranhos**
Às vezes, arquivos são criados com caracteres estranhos no nome. O sistema de arquivos Unix permite qualquer caractere como parte de um nome de arquivo, exceto um nulo (ASCII 000) ou uma "/". Todos os outros caracteres são permitidos.
Os usuários podem criar arquivos com caracteres que dificultam a visualização do diretório ou arquivo. Eles podem criar o diretório ".. " com um espaço no final, ou criar um arquivo que tenha um backspace no nome, usando:```bash
touch `printf "aa\bb"`
```
Agora o que acontece quando você usa o comando `ls`:````bash
ls
aa?b
ls | grep 'a'
ab
```
Note que quando o `ls` envia o resultado para um terminal, ele coloca um "**?**" no nome do arquivo para mostrar um caractere não imprimível.
Você pode se livrar desse arquivo usando `rm -i *` e ele irá solicitar confirmação antes de excluir cada arquivo. Mas você também pode usar o `find` para remover o arquivo, uma vez que você saiba o número do inode.```bash
ls -i
435304 aa?b
find . -inum 435304 -delete
```
Recursos úteis:
- [Entenda os conceitos básicos de inodes UNIX/Linux com exemplos](https://www.thegeekstuff.com/2012/01/linux-inodes/)
- [O que é um inode conforme definido pelo POSIX?](https://unix.stackexchange.com/questions/387087/what-is-an-inode-as-defined-by-posix/387093)
</details>
<details>
<summary><b><code>ls -l</code> mostra atributos de arquivo como pontos de interrogação. O que isso significa e que passos você tomará para remover arquivos "zumbis" não utilizados?</b></summary><br>
Este problema pode ser mais difícil de resolver porque várias etapas podem ser necessárias - às vezes você obtém `test/file: Permission denied`, `test/file: No such file or directory` ou `test/file: Input/output error`.
Isso acontece quando o usuário não pode executar um `stat()` nos arquivos (o que requer permissões de execução), mas pode ler as entradas do diretório (o que requer acesso de leitura no diretório). Então você obtém uma lista de arquivos no diretório, mas não consegue obter nenhuma informação sobre os arquivos porque eles não podem ser lidos. Se você tiver um diretório com permissão de leitura mas não de execução, verá isso.
Alguns processos como um `rsync` geram arquivos temporários que são criados e descartados rapidamente, o que causará erros se você tentar chamar outros comandos simples de gerenciamento de arquivos como `rm`, `mv` etc.
Exemplo de saída:```bash
?????????? ? ? ? ? ? sess_kee6fu9ag7tiph2jae
```
1) alterar permissões: `chmod 0777 sess_kee6fu9ag7tiph2jae` e tentar remover
2) alterar proprietário: `chown root:root sess_kee6fu9ag7tiph2jae` e tentar remover
3) alterar permissões e proprietário do diretório: `chmod -R 0777 dir/ && chown -R root:root dir/` e tentar remover
4) recriar arquivo: `touch sess_kee6fu9ag7tiph2jae` e tentar remover
5) fique atento a outros processos em execução no servidor, por exemplo `rsync`, às vezes você pode ver isso como um erro transitório quando um servidor NFS está muito sobrecarregado
6) encontre o inode do arquivo: `ls -i`, e tente remover: `find . -inum <inode_num> -delete`
7) remonte (se possível) seu sistema de arquivos
8) inicialize o sistema em modo single-user e repare seu sistema de arquivos com `fsck`
Recursos úteis:
- [Interrogações aparecendo no ls do diretório. Erros de IO também.](https://serverfault.com/questions/65616/question-marks-showing-in-ls-of-directory-io-errors-too)
</details>
<details>
<summary><b>LVM ou não LVM. Quais benefícios ele oferece?</b></summary><br>
- O LVM torna muito fácil mover sistemas de arquivos
- você pode estender um grupo de volumes para um novo volume físico
- mover qualquer número de volumes lógicos de um volume físico antigo
- remover esse volume do grupo de volumes sem precisar desmontar nenhuma partição
- você também pode fazer snapshots de volumes lógicos para realizar backups
- o LVM tem suporte interno a espelhamento, então você pode ter um volume lógico espelhado em vários volumes físicos
- o LVM até suporta TRIM
Recursos úteis:
- [O que é LVM e para que serve?](https://askubuntu.com/questions/3596/what-is-lvm-and-what-is-it-used-for)
</details>
<details>
<summary><b>Como aumentar o tamanho de uma partição LVM?</b></summary><br>
Use o comando `lvextend` para redimensionar a partição LVM.
- estender o tamanho em 500MB:```bash
lvextend -L +500M /dev/vgroup/lvolume
```
- expandindo todo o espaço livre disponível:```bash
lvextend -l +100%FREE /dev/vgroup/lvolume
```
e `resize2fs` ou `xfs_growfs` para redimensionar o sistema de arquivos:
- para sistemas de arquivos ext:```bash
resize2fs /dev/vgroup/lvolume
```
- para o sistema de ficheiros xfs:```bash
xfs_growfs mountpoint_for_/dev/vgroup/lvolume
```
Recursos úteis:
- [Estendendo um volume lógico](https://www.tldp.org/HOWTO/LVM-HOWTO/extendlv.html)
</details>
<details>
<summary><b>O que é um processo zumbi/defunto?</b></summary><br>
É um processo que concluiu sua execução (através da chamada de sistema `exit`) mas ainda possui uma entrada na tabela de processos: é um processo no "**estado terminado**".
Processos marcados como **defuntos** são processos mortos (os chamados "zumbis") que permanecem porque seu pai não os destruiu corretamente. Esses processos serão destruídos pelo init se o processo pai for encerrado.
Recursos úteis:
- [O que é um processo <defunto> e por que ele não é morto?](https://askubuntu.com/questions/201303/what-is-a-defunct-process-and-why-doesnt-it-get-killed)
</details>
<details>
<summary><b>Qual é a maneira correta de atualizar/atualizar um sistema em produção? Você automatiza esses processos? Você define um tempo de inatividade para eles? Escreva recomendações. ***</b></summary><br>
A ser completado.
</details>
<details>
<summary><b>Seu amigo durante a configuração do servidor MySQL perguntou: <i>Devo executar <code>sudo mysql_secure_installation</code> após instalar o mysql?</i> O que você acha disso?</b></summary><br>
Seria melhor se você executar o comando, pois ele fornece muitas opções de segurança, como:
- Você pode definir uma senha para as contas root
- Você pode remover contas root que são acessíveis fora do host local
- Você pode remover contas de usuários anônimos
- Você pode remover o banco de dados de teste, que por padrão pode ser acessado por usuários anônimos
Recursos úteis:
- [Qual é o propósito de usar mysql_secure_installation?](https://stackoverflow.com/questions/20760908/what-is-purpose-of-using-mysql-secure-installation)
</details>
<details>
<summary><b>Apresente e explique as boas maneiras de usar o comando <code>kill</code>.</b></summary><br>
Falando sobre matar processos, nunca use `kill -9/SIGKILL` a menos que seja absolutamente necessário. Esse kill pode causar problemas devido à sua força bruta.
Sempre tente usar o seguinte procedimento simples:
- primeiro, envie o sinal **SIGTERM** (`kill -15`) primeiro, que diz ao processo para desligar e geralmente é aceito como o sinal a ser usado ao desligar de forma limpa (mas lembre-se de que esse sinal pode ser ignorado).
- em seguida, tente enviar o sinal **SIGHUP** (`kill -1`), que é comumente usado para dizer a um processo para desligar e reiniciar; este sinal também pode ser capturado e ignorado por um processo.
A grande maioria das vezes, isso é tudo o que você precisa – e é muito mais limpo.
Recursos úteis:
- [Quando não devo usar kill -9 em um processo?](https://unix.stackexchange.com/questions/8916/when-should-i-not-kill-9-a-process)
- [SIGTERM vs. SIGKILL](https://major.io/2010/03/18/sigterm-vs-sigkill/)
</details>
<details>
<summary><b>O que é o comando <code>strace</code> e como deve ser usado? Explique um exemplo de conexão a um processo já em execução.</b></summary><br>
`strace` é uma poderosa ferramenta de linha de comando para depuração e solução de problemas de programas em sistemas operacionais do tipo Unix, como Linux. Ele captura e registra todas as chamadas de sistema feitas por um processo e os sinais recebidos pelo processo.
**Visão geral do Strace**
`strace` pode ser visto como um depurador leve. Ele permite que um programador/usuário descubra rapidamente como um programa está interagindo com o SO. Ele faz isso monitorando chamadas de sistema e sinais.
**Usos**
Bom para quando você não tem o código fonte ou não quer se preocupar em realmente analisá-lo. Também é útil para seu próprio código se você não quiser abrir o **GDB**, mas estiver apenas interessado em entender a interação externa.
**Exemplo de anexação ao processo**
`strace -p <PID>` - para anexar um processo ao strace.
`strace -e trace=read,write -p <PID>` - com isso você também pode rastrear um processo/programa para um evento, como read e write (neste exemplo). Assim, aqui ele imprimirá todos esses eventos que incluem chamadas de sistema read e write pelo processo.
Outros exemplos
- `-e trace=network` - rastreia todas as chamadas de sistema relacionadas à rede.
- `-e trace=signal` - rastreia todas as chamadas de sistema relacionadas a sinais.
- `-e trace=ipc` - rastreia todas as chamadas de sistema relacionadas a IPC.
- `-e trace=desc` - rastreia todas as chamadas de sistema relacionadas a descritores de arquivo.
- `-e trace=memory` - rastreia todas as chamadas de sistema relacionadas a mapeamento de memória.
Recursos úteis:
- [Como o strace deve ser usado? (original)](https://stackoverflow.com/questions/174942/how-should-strace-be-used)
- [Como o strace se conecta a um processo já em execução? (original)](https://stackoverflow.com/questions/7482076/how-does-strace-connect-to-an-already-running-process)
- [strace: por diversão, lucro e depuração](http://timetobleed.com/hello-world/)
</details>
<details>
<summary><b>Quando você usaria listas de controle de acesso em vez de ou em conjunto com o comando <code>chmod</code>? ***</b></summary><br>
A ser completado.
</details>
<details>
<summary><b>Quais algoritmos são suportados no arquivo <code>/etc/shadow</code>?</b></summary><br>
Os algoritmos típicos atuais são:
- MD5
- SHA-1 (também chamado de SHA)
ambos não devem mais ser usados para fins criptográficos/de segurança!!
- SHA-256
- SHA-512
- SHA-3 (KECCAK foi anunciado como vencedor da competição por um novo algoritmo hash aprovado federalmente em outubro de 2012)
Recursos úteis:
- [Qual é o algoritmo usado para criptografar senhas do Linux?](https://crypto.stackexchange.com/questions/40841/what-is-the-algorithm-used-to-encrypt-linux-passwords)
- [Como encontrar o algoritmo de hash usado para ofuscar senhas?](https://unix.stackexchange.com/questions/430141/how-to-find-the-hashing-algorithm-used-to-obfuscate-passwords)
</details>
<details>
<summary><b>Qual é o uso do ulimit em sistemas do tipo Unix?</b></summary><br>
A maioria dos sistemas operacionais do tipo Unix, incluindo Linux e BSD, fornece maneiras de limitar e controlar o uso de recursos do sistema, como threads, arquivos e conexões de rede, por processo e por usuário. Esses "**ulimits**" impedem que usuários individuais usem muitos recursos do sistema.
</details>
<details>
<summary><b>O que são limites flexíveis e limites rígidos?</b></summary><br>
**Limite rígido** é o máximo permitido para um usuário, definido pelo superusuário ou root. Este valor é definido no arquivo `/etc/security/limits.conf`. O usuário pode aumentar o **limite flexível** por conta própria quando precisar de mais recursos, mas não pode definir o **limite flexível** acima do **limite rígido**.
</details>
<details>
<summary><b>Durante a configuração do HAProxy para funcionar com Redis, você obtém <code>General socket error (Permission denied)</code> no log. O SELinux está ativado. Explique a solução básica de problemas do SELinux na CLI. ***</b></summary><br>
Recursos úteis:
- [Solução básica de problemas do SELinux na CLI](https://access.redhat.com/articles/2191331)
</details>
<details>
<summary><b>Você configurou um login de chave RSA, mas seu servidor mostra <code>Server refused our key</code> conforme esperado. Onde você procurará a causa do problema?</b></summary><br>
**Lado do servidor**
Definir `LogLevel VERBOSE` no arquivo `/etc/ssh/sshd_config` é provavelmente o que você precisa, embora existam níveis mais altos:
As falhas de autenticação SSH são registradas em `/var/log/auth.log`, `/var/log/secure` ou `/var/log/audit/audit.log`.
O seguinte deve fornecer apenas linhas de log relacionadas ao SSH (por exemplo):```bash
grep 'sshd' /var/log/auth.log
```
Em seguida, o comando mais simples para listar todas as tentativas de login SSH falhadas é o mostrado abaixo:```bash
grep "Failed password" /var/log/auth.log
```
também é útil:```bash
grep "Failed\|Failure" /var/log/auth.log
```
Em distribuições Linux mais recentes, você pode consultar o arquivo de log de tempo de execução mantido pelo daemon Systemd através do comando `journalctl` (`ssh.service` ou `sshd.service`). Por exemplo:
```bash```bash
journalctl _SYSTEMD_UNIT=ssh.service | egrep "Failed|Failure"
```
**Lado do cliente**
Lembre-se também de executar o cliente SSH com `-v|--verbose` - está no primeiro nível de verbosidade. Em seguida, você pode ativar verbosidade adicional (nível 2 e 3) para ainda mais mensagens de depuração, conforme mostrado com, por exemplo, `-vv`.
Recursos úteis:
- [Ativar Modo de Depuração no SSH para Solucionar Problemas de Conectividade](https://www.tecmint.com/enable-debugging-mode-in-ssh/)
</details>
<details>
<summary><b>Por que a maioria das distribuições usa ext4, em vez de XFS ou outros sistemas de arquivos? Por que existem tantos deles? ***</b></summary><br>
A ser concluído.
</details>
<details>
<summary><b>Um gerente de projeto precisa de um novo SQL Server. O que você pergunta a ele/ela? ***</b></summary><br>
Quero que o DBA faça perguntas como:
- Qual será o tamanho do banco de dados? (se podemos adicionar o banco de dados a um servidor existente)
- Quão crítico é o banco de dados? (sobre clustering, recuperação de desastres, alta disponibilidade)
</details>
<details>
<summary><b>Criar um arquivo com 100 linhas com valores aleatórios.</b></summary><br>
Por exemplo:
```bash```bash
cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 100 > /path/to/file
```
</details>
<details>
<summary><b>Como executar script como outro usuário sem senha?</b></summary><br>
Por exemplo (com o comando `visudo`):```bash
user1 ALL=(user2) NOPASSWD: /opt/scripts/bin/generate.sh
```
Os caminhos dos comandos devem ser absolutos! Em seguida, chame `sudo -u user2 /opt/scripts/bin/generate.sh` a partir de um shell user1.
</details>
<details>
<summary><b>Como verificar se está executando como root em um script bash? O que você deve observar?</b></summary><br>
Em um script bash, você tem várias maneiras de verificar se o usuário em execução é root.
Como aviso, não verifique se um usuário é root usando o nome de usuário root. Nada garante que o usuário com ID 0 seja chamado root. É uma convenção muito forte que é amplamente seguida, mas qualquer pessoa poderia renomear o superusuário para outro nome.
Acho que a melhor maneira ao usar bash é usar `$EUID` porque `$UID` pode ser alterado e não refletir o usuário real executando o script.```bash
if (( $EUID != 0 )); then
echo "Please run as root"
exit
fi
```
</details>
<details>
<summary><b>Podes dar um exemplo específico de quando é indicado usar a conta <code>nobody</code>? Fala-me das diferenças em executar o serviço httpd como uma conta <code>nobody</code> e <code>www-data</code>.</b></summary><br>
Em muitas variantes Unix, `nobody` é o nome convencional de uma conta de utilizador que não possui ficheiros, não está em grupos privilegiados e não tem capacidades além daquelas que qualquer outro utilizador tem.
É comum executar daemons como `nobody`, especialmente servidores, de forma a limitar os danos que um utilizador malicioso poderia causar ao obter controlo sobre eles.
No entanto, a utilidade desta técnica é reduzida se mais do que um daemon for executado desta forma, porque obter controlo de um daemon daria controlo sobre todos eles. A razão é que os processos pertencentes a `nobody` têm a capacidade de enviar sinais uns aos outros e até depurar uns aos outros, permitindo-lhes ler ou até modificar a memória uns dos outros.
**Quando devo usar a conta `nobody`?**
Quando não são necessárias permissões para as operações de um programa. Isto é mais notável quando não vai haver qualquer atividade de disco.
Um exemplo real disto é o **memcached** (uma cache/base de dados/coisa em memória chave-valor), a correr no meu computador e no meu servidor sob a conta `nobody`. Porquê? Porque simplesmente não precisa de nenhuma permissão e dar-lhe uma conta que tivesse acesso de escrita a ficheiros seria apenas um risco desnecessário.
Um bom exemplo são também os servidores web. Imagina se o Apache corresse como root e alguém encontrasse uma forma de enviar comandos personalizados para a consola através do Apache, teria acesso a todo o teu sistema.
A conta `nobody` também é usada como uma shell restrita para dar acesso ao sistema de ficheiros aos utilizadores sem uma shell real como o bash. Isto deve impedi-los de conseguir executar coisas.
**`nobody` ou `www-data` para httpd (Apache)**
Ao iniciar, o Apache precisa de acesso root, mas rapidamente abandona esse acesso e assume a identidade de um utilizador não privilegiado. Este utilizador pode ser `nobody` ou `apache`, ou `www-data`.
Várias aplicações usam o utilizador `nobody` como padrão. Por exemplo, provavelmente nunca queres que o serviço Apache sobrescreva ficheiros que pertencem ao bind. Ter uma conta por serviço tende a ser uma ideia muito boa.
Fazer o Apache correr como `nobody:nobody` é bastante fácil, basta atualizar as definições de utilizador e grupo. Mas como mencionei acima, não recomendo esse utilizador/grupo em particular. É perfeitamente possível que sejas tentado a adicionar um serviço ao sistema no futuro que também corra como `nobody`, e esquecer-te-ás que deste acesso de escrita no sistema de ficheiros ao utilizador `nobody`.
Se, de alguma forma, `nobody` fosse comprometido, poderia ter mais impacto do que se fosse um utilizador isolado para a aplicação, como `www-data`. Claro que muito disto dependerá das permissões de ficheiro e grupo. `nobody` usa as permissões de outros, enquanto um utilizador específico da aplicação poderia ser configurado para permitir acesso de leitura a ficheiros, mas outros ainda poderiam ser negados.
Recursos úteis:
- [What is nobody user and group?](https://unix.stackexchange.com/questions/186568/what-is-nobody-user-and-group)
- [The Linux and Unix Nobody User](http://linuxg.net/the-linux-and-unix-nobody-user/)
- [What is the purpose of the 'nobody' user?](https://askubuntu.com/questions/329714/what-is-the-purpose-of-the-nobody-user)
</details>
<details>
<summary><b>Existe alguma forma de redirecionar a saída para um ficheiro e também exibi-la no stdout?</b></summary><br>
O comando que procuras chama-se tee:
`foo | tee output.file`
Por exemplo, se só te importas com o stdout:
`ls -a | tee output.file`
Se quiseres incluir o stderr, faz:
`program [arguments...] 2>&1 | tee outfile`
`2>&1` redireciona o canal 2 (stderr/erro padrão) para o canal 1 (stdout/saída padrão), de modo que ambos são escritos como stdout. Também é direcionado para o ficheiro de saída indicado graças ao comando tee.
Além disso, se quiseres adicionar ao ficheiro de log, usa `tee -a`:
`program [arguments...] 2>&1 | tee -a outfile`
</details>
<details>
<summary><b>Qual é o shebang bash preferido e porquê? Qual é a diferença entre executar um ficheiro usando <code>./script</code> ou <code>bash script</code>?</b></summary><br>
Deves usar `#!/usr/bin/env bash` por portabilidade: diferentes \*nixes colocam o bash em locais diferentes, e usar `/usr/bin/env` é uma forma de contornar isso para executar o primeiro bash encontrado no `PATH`.
Executar `./script` faz exatamente isso, e requer permissão de execução no ficheiro, mas é agnóstico quanto ao tipo de programa. Pode ser um **script bash**, um **script sh**, ou um **script Perl**, **Python**, **awk**, ou **expect**, ou um **binário executável** real. Executar `bash script` forçaria a sua execução sob `sh`, em vez de qualquer outra coisa.
Recursos úteis:
- [What is the preferred Bash shebang? (original)](https://stackoverflow.com/questions/10376206/what-is-the-preferred-bash-shebang)
</details>
<details>
<summary><b>Tens de executar um comando que vai demorar muito tempo. Como evitar que este processo seja interrompido após a sessão ssh ser perdida?</b></summary><br>
Usa `nohup` para fazer o teu processo ignorar o sinal de hangup:```bash
nohup long-running-process &
exit
```
ou se você quiser usar **GNU Screen**:```bash
screen -d -m long-running-process
exit
```
Recursos úteis:
- [5 Maneiras de Manter Sessões SSH Remotas e Processos em Execução Após a Desconexão](https://www.tecmint.com/keep-remote-ssh-sessions-running-after-disconnection/)
</details>
<details>
<summary><b>Qual é o principal propósito das autoridades de certificação intermediárias?</b></summary><br>
Para descobrir o principal propósito de uma CA intermediária, você deve primeiro aprender sobre **CAs Raiz**, **CAs Intermediárias** e a **Cadeia de Confiança do Certificado SSL**.
**CAs Raiz** são CAs primárias que normalmente não assinam diretamente certificados de entidade final/servidor. Elas emitem certificados raiz que geralmente são pré-instalados em todos os navegadores, dispositivos móveis e aplicativos. A chave privada desses certificados é usada para assinar outros certificados subsequentes chamados certificados intermediários. As CAs Raiz geralmente são mantidas “offline” e em um ambiente altamente seguro com acesso rigorosamente limitado.
**CAs Intermediárias** são CAs que se subordinam à CA Raiz por um ou mais níveis, sendo confiadas por estas para assinar certificados em seu nome. O propósito de criar e usar CAs Intermediárias é principalmente por segurança, pois se a chave privada intermediária for comprometida, a CA Raiz pode revogar o certificado intermediário e criar um novo com um novo par de chaves criptográficas.
| O tipo de capítulo | Número de perguntas | Breve descrição |
|---|
| Introdução | ||
| 🔸 Perguntas Simples | 14 perguntas | Descontraídas, divertidas e simples - são ótimas para começar tudo. |
| Conhecimento Geral | ||
| 🔸 Junior Sysadmin | 65 perguntas | Razoavelmente simples e diretas, baseadas em conhecimento básico. |
| 🔸 Regular Sysadmin | 94 perguntas | Nível médio de perguntas para quem tem conhecimento sólido. |
| 🔸 Senior Sysadmin | 99 perguntas | Perguntas difíceis e enigmas. Verifique se você quer ser bom. |
| Conhecimento Secreto | ||
| 🔸 Guru Sysadmin | 12 perguntas | Perguntas realmente profundas para conhecer o Guru Sysadmin. |
Dicas & Truques
CTRL + Rpopd/pushd e outros builtins do shell que permitem manipular a pilha de diretóriosCTRL + U, CTRL + E!* - todos os argumentos do último comando!! - todo o último comando!ssh - último comando começando com sshRecursos úteis:
Para informações extensas, incluindo nome de usuário, terminal, número IP do computador de origem, a hora em que o login começou, qualquer tempo ocioso, ciclos de CPU do processo, ciclos de CPU do job e o comando atualmente em execução, digite:```bash
w
Também importante para exibir uma lista dos últimos usuários que fizeram login, digite:```bash
# It uses /var/log/wtmp.
last
Recursos úteis:
ou```bash grep -e "string1" -e "string2" filename
Recursos úteis:
- [O que é grep e como usá-lo? (original)](https://kb.iu.edu/d/afiy)
</details>
<details>
<summary><b>Explique os comandos de conteúdo de arquivo junto com a descrição.</b></summary><br>
- `head`: para verificar o início de um arquivo.
- `tail`: para verificar o final do arquivo. É o inverso do comando head.
- `cat`: usado para visualizar, criar, concatenar os arquivos.
- `more`: usado para exibir o texto na janela do terminal em formato de pager.
- `less`: usado para visualizar o texto na direção inversa e também fornece movimento de linha única.
Recursos úteis:
- [Visualizando arquivos de texto a partir do prompt do shell](https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/4/html/Step_by_Step_Guide/s1-viewingtext-terminal.html)
</details>
<details>
<summary><b>Sinais POSIX SIGHUP, SIGINT, SIGKILL e SIGTERM. Explique.</b></summary><br>
- **SIGHUP** - é enviado a um processo quando seu terminal de controle é fechado. Foi originalmente projetado para notificar o processo de uma queda de linha serial (um desligamento). Muitos daemons recarregam seus arquivos de configuração e reabrem seus arquivos de log em vez de sair ao receber este sinal.
- **SIGINT** - é enviado a um processo por seu terminal de controle quando um usuário deseja interromper o processo. Isso é tipicamente iniciado ao pressionar `Ctrl+C`, mas em alguns sistemas, o caractere "delete" ou a tecla "break" podem ser usados.
- **SIGKILL** - é enviado a um processo para fazê-lo terminar imediatamente (matar). Em contraste com **SIGTERM** e **SIGINT**, este sinal não pode ser capturado ou ignorado, e o processo receptor não pode realizar nenhuma limpeza ao receber este sinal.
- **SIGTERM** - é enviado a um processo para solicitar sua terminação. Diferente do sinal **SIGKILL**, ele pode ser capturado e interpretado ou ignorado pelo processo. Isso permite que o processo realize uma terminação adequada, liberando recursos e salvando estado, se apropriado. **SIGINT** é quase idêntico a **SIGTERM**.
Recursos úteis:
- [Sinais POSIX](https://dsa.cs.tsinghua.edu.cn/oj/static/unix_signal.html)
- [Introdução à Programação de Sinais Unix](http://titania.ctie.monash.edu.au/signals/)
</details>
<details>
<summary><b>O que o comando <code>kill</code> faz?</b></summary><br>
Em sistemas Unix e similares ao Unix, `kill` é um comando usado para enviar um sinal a um processo. Por padrão, a mensagem enviada é o sinal de terminação, que solicita que o processo saia. Mas `kill` é um tanto enganoso; o sinal enviado pode não ter nada a ver com a eliminação do processo.
Recursos úteis:
- [Dominando o comando "Kill" no Linux](https://www.maketecheasier.com/kill-command-in-linux/)
</details>
<details>
<summary><b>Qual é a diferença entre <code>rm</code> e <code>rm -rf</code>?</b></summary><br>
`rm` apenas exclui os arquivos nomeados (e não diretórios). Com `-rf` como você disse:
- `-r`, `-R`, `--recursive` exclui recursivamente o conteúdo de um diretório, incluindo arquivos ocultos e subdiretórios
- `-f`, `--force` ignora arquivos inexistentes, nunca pergunta
Recursos úteis:
- [Qual é a diferença entre `rm -r` e `rm -f`?](https://superuser.com/questions/1126206/what-is-the-difference-between-rm-r-and-rm-f)
</details>
<details>
<summary><b>Como faço para <code>grep</code> recursivamente? Explique com vários exemplos. ***</b></summary>
A ser completado.
</details>
<details>
<summary><b><code>archive.tgz</code> tem cerca de 30 GB. Como listar o conteúdo e extrair apenas um arquivo?</b></summary><br>```bash
# list of content
tar tf archive.tgz
# extract file
tar xf archive.tgz filename
Recursos úteis:
r - para permissão de leituraw - para permissão de escritaRecursos úteis:
Recursos úteis:
Sub-rede nada mais é do que um intervalo de endereços IP que ajuda os hosts a se comunicarem nas camadas 2 e 3. Cada sub-rede não requer sua própria VLAN. VLANs são implementadas para isolamento (são uma sandbox para comunicação na camada dois; nenhum sistema de duas VLANs diferentes pode se comunicar, mas isso pode ser feito através de Roteamento Inter VLAN), facilidade de gerenciamento e segurança.
Recursos úteis:
| SERVIÇO | PORTA |
|---|---|
| SMTP | 25 |
| FTP | 20 para transferência de dados e 21 para estabelecimento de conexão |
| DNS | 53 |
| DHCP | 67/UDP para servidor DHCP, 68/UDP para cliente DHCP |
| SSH | 22 |
Recursos úteis:
Você pode (às vezes) resolver um endereço IP de volta para um nome de host. O endereço IP pode ser armazenado contra um registro PTR. Você pode então fazer:```bash dig A
Para consultar o endereço IPv4 de um host, ou:```bash
dig AAAA <hostname>
Para consultar o endereço IPv6 de um host, ou:```bash dig PTR ZZZ.YYY.XXX.WWW.in-addr.arpa.
Para consultar o nome do host para o endereço IPv4 `WWW.XXX.YYY.ZZZ` (note que os octetos estão invertidos), ou:```bash
dig PTR b.a.9.8.7.6.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.
Recursos úteis:
Quando o user2 deseja alterar a sua senha, ele executa /usr/bin/passwd.
O RUID será user2, mas o EUID desse processo será root.
O user2 pode usar apenas o passwd para alterar a sua própria senha, porque internamente o passwd verifica o RUID e, se não for root, as suas ações serão limitadas à senha do utilizador real.
É necessário que o EUID se torne root no caso do passwd, porque o processo precisa escrever em /etc/passwd e/ou /etc/shadow.
Recursos úteis:
Recursos úteis:
| Umask | Resultado do arquivo | Resultado do diretório |
|---|---|---|
| 000 | 666 rw- rw- rw- | 777 rwx rwx rwx |
| 002 | 664 rw- rw- r-- | 775 rwx rwx r-x |
| 022 | 644 rw- r-- r-- | 755 rwx r-x r-x |
| 027 | 640 rw- r-- --- | 750 rwx r-x --- |
| 077 | 600 rw---- --- | 700 rwx --- --- |
| 277 | 400 r-- --- --- | 500 r-x --- --- |
Recursos úteis:
guid ativado & bit executável desabilitado (S maiúsculo) - os bits rwxr-Sr-x estão definidos.```bash
chmod g-x b.pl
ls -lt b.pl
-rwxr-Sr-x 1 root root 179 Jan 9 01:01 b.pl
**sticky bit**
O sticky bit, por outro lado, é denotado como `t`, como no diretório `/tmp`:```bash
ls -l /|grep tmp
drwxrwxrwt. 168 root root 28672 Jun 14 08:36 tmp
Este bit deveria ter sido sempre chamado de bit de exclusão restrita já que é isso que ele realmente significa. Quando este bit de modo está ativado, ele torna um diretório tal que os usuários só podem excluir arquivos e diretórios dentro dele dos quais são proprietários.
Recursos úteis:
Se `LC_ALL` não funcionar, tente usar `LANG` (se ainda assim não funcionar, tente `LANGUAGE`):```bash
LANG=C date +%A
Monday
Recursos úteis:
Portanto, o utilizador **alice** tem privilégios padrão para `/var/www/app01` e o utilizador **bob** tem privilégios padrão para `/var/www/app01` e `/var/www/app02`.
**5) Proprietário e grupo do servidor web**
Quaisquer ficheiros ou diretórios que precisem de ser escritos pelo servidor web têm o seu proprietário. Se o servidor web for Apache, o proprietário/grupo padrão são **apache:apache** ou **www-data:www-data** e para Nginx será **nginx:nginx**. Não altere estas definições.
Se as aplicações funcionam com servidores de aplicação como **uwsgi** ou **php-fpm**, deve definir o utilizador e grupo apropriados (por exemplo, para **app01** será **u01-prod:g01-prod**) em ficheiros de configuração específicos.
**6) Permissões**
Defina as permissões adequadamente com **Listas de Controlo de Acesso**:```bash
# For web server
setfacl -Rdm "g:apache:rwx" /var/www/app01
setfacl -Rm "g:apache:rwx" /var/www/app01
# For developers
setfacl -Rdm "g:g01-prod:rwx" /var/www/app01
setfacl -Rm "g:g01-prod:rwx" /var/www/app01
Se você usar SELinux, lembre-se do contexto de segurança:```bash chcon -R system_u:object_r:httpd_sys_content_t /var/www/app01
**7) Erros de segurança**
- Proprietário **root** para arquivos e diretórios
- **root** nunca executa arquivos no diretório do site, e não deve criar arquivos lá
- permissões muito amplas como **777** para que alguns arquivos críticos possam ser graváveis e legíveis por todos
- evite criar scripts de manutenção ou outros arquivos críticos com suid root
Se você permitir que seu site modifique os arquivos que formam o código que executa seu site, você torna muito mais fácil para alguém assumir o controle do seu servidor.
Uma ferramenta de upload de arquivos permite que os usuários enviem um arquivo com qualquer nome e qualquer conteúdo. Isso permite que um usuário envie um script PHP de relay de e-mail para o seu site, que pode ser colocado onde quiser para transformar seu servidor em uma máquina de encaminhamento de e-mails comerciais não solicitados. Esse script também pode ser usado para ler todos os endereços de e-mail do seu banco de dados ou outras informações pessoais.
Se o usuário malicioso puder enviar um arquivo com qualquer nome, mas não controlar o conteúdo, ele pode facilmente enviar um arquivo que sobrescreva seu `index.php` (ou outro arquivo crítico) e quebre seu site.
Recursos úteis:
- [How to setup linux permissions for the WWW folder?](https://serverfault.com/questions/124800/how-to-setup-linux-permissions-for-the-www-folder)
- [What permissions should my website files/folders have on a Linux webserver?](https://serverfault.com/questions/357108/what-permissions-should-my-website-files-folders-have-on-a-linux-webserver)
- [Security Pitfalls of setgid Programs](https://www.agwa.name/blog/post/security_pitfalls_of_setgid_programs)
</details>
<details>
<summary><b>Quais passos serão tomados pelo init quando você executar <code>telinit 1</code> a partir do run level 3? Qual será o resultado final disso? Se você usar <code>telinit 6</code> em vez do comando <code>reboot</code>, seu servidor será reiniciado? ***</b></summary><br>
A ser preenchido.
Recursos úteis:
- [What differences it will make, if i use “telinit 6” instead of “reboot” command to restart my computer?](https://unix.stackexchange.com/questions/434560/what-differences-it-will-make-if-i-use-telinit-6-instead-of-reboot-command)
</details>
<details>
<summary><b>Esqueci a senha de root! O que faço no BSD? Qual é o propósito de inicializar no modo single-user?</b></summary><br>
Reinicie o sistema, digite `boot -s` no prompt `Boot:` para entrar no **modo single-user**.
Na pergunta sobre qual shell usar, pressione `Enter`, que exibirá um prompt `#`.
Digite `mount -urw /` para remontar o sistema de arquivos raiz como leitura/gravação, em seguida execute `mount -a` para remontar todos os sistemas de arquivos.
Execute `passwd root` para alterar a senha de root e depois execute `exit` para continuar a inicialização.
**Modo single-user** deve basicamente permitir que você faça login com acesso root e altere praticamente qualquer coisa. Por exemplo, você pode usar o modo single-user quando estiver restaurando um banco de dados master danificado ou um banco de dados do sistema, ou quando estiver alterando opções de configuração do servidor (ex.: recuperação de senha).
Recursos úteis:
- [FreeBSD Reset or Recover Root Password](https://www.cyberciti.biz/tips/howto-freebsd-reset-recover-root-password.html)
- [Single User Mode Definition](http://www.linfo.org/single_user_mode.html)
</details>
<details>
<summary><b>Como você poderia modificar um arquivo de texto sem invocar um editor de texto?</b></summary><br>
Por exemplo:<br>```bash
# cat >filename ... - overwrite file
# cat >>filename ... - append to file
cat > filename << __EOF__
data
__EOF__