IPFS sem dor (mas isso não é preciso)

IPFS sem dor (mas isso não é preciso)

Apesar de Habré já estar mais de um artigo sobre IPFS.

Vou esclarecer desde já que não sou especialista nesta área, mas já demonstrei interesse nesta tecnologia mais de uma vez, mas tentar brincar com ela muitas vezes causava alguma dor. Hoje comecei a experimentar novamente e obtive alguns resultados que gostaria de compartilhar. Resumindo, será descrito o processo de instalação do IPFS e alguns recursos (tudo foi feito no ubuntu, não tentei em outras plataformas).

Se você perdeu o que é IPFS, está escrito com alguns detalhes aqui: habr.com/en/post/314768

Instalação

Para a pureza do experimento, sugiro instalá-lo imediatamente em algum servidor externo, pois consideraremos algumas armadilhas ao trabalhar em modo local e remoto. Aí, se quiser, não vai ser demolido por muito tempo, não tem muito.

Instalar vá

Documentação oficial
Veja a versão atual em golang.org/dl

Observação: é melhor instalar o IPFS em nome do usuário que o usará com mais frequência. O fato é que a seguir consideraremos a opção de montagem via FUSE e há sutilezas.

cd ~
curl -O https://dl.google.com/go/go1.12.9.linux-amd64.tar.gz
tar xvf go1.12.9.linux-amd64.tar.gz
sudo chown -R root:root ./go
sudo mv go /usr/local
rm go1.12.9.linux-amd64.tar.gz

Então você precisa atualizar o ambiente (mais detalhes aqui: golang.org/doc/code.html#GOPATH).

echo 'export GOPATH=$HOME/work' >> ~/.bashrc
echo 'export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin' >> ~/.bashrc
source ~/.bashrc

Verificando se o go está instalado

go version

Instalar IPFS

Gostei mais do método de instalação atualização ipfs.

Instale-o com o comando

go get -v -u github.com/ipfs/ipfs-update

Depois disso, você pode executar os seguintes comandos:

versões de atualização ipfs - para ver todas as versões disponíveis para download.
versão de atualização do ipfs - para ver a versão atualmente instalada (até que tenhamos o IPFS instalado, não haverá nenhuma).
instalação do ipfs-update mais recente - instale a versão mais recente do IPFS. Em vez de mais recente, respectivamente, você pode especificar qualquer versão desejada na lista de versões disponíveis.

Instalando ipfs

ipfs-update install latest

Verificar

ipfs --version

Diretamente com a instalação em termos gerais tudo.

Iniciar IPFS

Inicialização

Primeiro você precisa realizar a inicialização.

ipfs init

Em resposta, você receberá algo assim:

 ipfs init
initializing IPFS node at /home/USERNAME/.ipfs
generating 2048-bit RSA keypair...done
peer identity: QmeCWX1DD7HnXXXXXXXXXXXXXXXXXXXXXXXXxxx
to get started, enter:
	ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme

Você pode executar o comando sugerido

ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme

resultado

Hello and Welcome to IPFS!

██╗██████╗ ███████╗███████╗
██║██╔══██╗██╔════╝██╔════╝
██║██████╔╝█████╗  ███████╗
██║██╔═══╝ ██╔══╝  ╚════██║
██║██║     ██║     ███████║
╚═╝╚═╝     ╚═╝     ╚══════╝

If you're seeing this, you have successfully installed
IPFS and are now interfacing with the ipfs merkledag!

 -------------------------------------------------------
| Warning:                                              |
|   This is alpha software. Use at your own discretion! |
|   Much is missing or lacking polish. There are bugs.  |
|   Not yet secure. Read the security notes for more.   |
 -------------------------------------------------------

Check out some of the other files in this directory:

  ./about
  ./help
  ./quick-start     <-- usage examples
  ./readme          <-- this file
  ./security-notes

Aqui, na minha opinião, começa o interessante. A galera na fase de instalação já está começando a usar tecnologias próprias. O hash proposto QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv não é gerado especificamente para você, mas integrado no lançamento. Ou seja, antes do lançamento, eles prepararam um texto de boas-vindas, despejaram no IPFS e adicionaram o endereço ao instalador. Eu acho que é muito legal. E este arquivo (mais precisamente, a pasta inteira) agora pode ser visualizado não só localmente, mas também no gateway oficial ipfs.io/ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv. Ao mesmo tempo, você pode ter certeza de que o conteúdo da pasta não mudou de forma alguma, pois se tivesse mudado, o hash também teria mudado.

Aliás, neste caso, o IPFS tem algumas semelhanças com o servidor de controle de versão. Se você fizer alterações nos arquivos de origem da pasta e despejar a pasta novamente no IPFS, ela receberá um novo endereço. Ao mesmo tempo, a pasta antiga não irá a lugar nenhum e estará disponível no endereço anterior.

Lançamento direto

ipfs daemon

Você deverá receber uma resposta como esta:

ipfs daemon
Initializing daemon...
go-ipfs version: 0.4.22-
Repo version: 7
System version: amd64/linux
Golang version: go1.12.7
Swarm listening on /ip4/x.x.x.x/tcp/4001
Swarm listening on /ip4/127.0.0.1/tcp/4001
Swarm listening on /ip6/::1/tcp/4001
Swarm listening on /p2p-circuit
Swarm announcing /ip4/127.0.0.1/tcp/4001
Swarm announcing /ip6/::1/tcp/4001
API server listening on /ip4/127.0.0.1/tcp/5001
WebUI: http://127.0.0.1:5001/webui
Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080
Daemon is ready

Abrindo as portas para a Internet

Preste atenção a estas duas linhas:

WebUI: http://127.0.0.1:5001/webui
Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080

Agora, se você instalou o IPFS localmente, você acessará as interfaces IPFS em endereços locais e tudo estará disponível para você (por exemplo, localhost:5001/webui/). Mas quando instalado em um servidor externo, por padrão, os gateways ficam fechados para a Internet. Gateways dois:

  1. administrador webui (github) na porta 5001.
  2. API externa na porta 8080 (somente leitura).

Até agora, ambas as portas (5001 e 8080) podem ser abertas para experimentos, mas em um servidor de combate, é claro, a porta 5001 deve ser fechada com um firewall. Há também a porta 4001, necessária para que outros pares possam encontrá-lo. Deve ser deixado aberto a solicitações externas.

Abra ~/.ipfs/config para edição e encontre estas linhas nele:

"Addresses": {
  "Swarm": [
    "/ip4/0.0.0.0/tcp/4001",
    "/ip6/::/tcp/4001"
  ],
  "Announce": [],
  "NoAnnounce": [],
  "API": "/ip4/127.0.0.1/tcp/5001",
  "Gateway": "/ip4/127.0.0.1/tcp/8080"
}

Mude 127.0.0.1 para o ip do seu servidor e salve o arquivo, então reinicie o ipfs (pare o comando em execução com Ctrl+C e reinicie).

Deveria conseguir

...
WebUI: http://ip_вашего_сервера:5001/webui
Gateway (readonly) server listening on /ip4/ip_вашего_сервера/tcp/8080

Agora as interfaces externas devem estar disponíveis.

Verificar

http://домен_или_ip_сервера:8080/ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme

O arquivo leia-me acima deve ser aberto.

http://домен_или_ip_сервера:5001/webui/

A interface da web deve abrir.

Se o webui funcionar para você, as configurações do IPFS podem ser alteradas diretamente nele, incluindo a visualização de estatísticas, mas a seguir considerarei as opções de configuração diretamente por meio do arquivo de configuração, o que geralmente não é crítico. É melhor lembrar exatamente onde está a configuração e o que fazer com ela, caso contrário, se o web face não funcionar, será mais difícil.

Configurando uma interface web para funcionar com seu servidor

Aqui está a primeira armadilha, que durou cerca de três horas.

Se você instalou o IPFS em um servidor externo, mas não instalou ou executou o IPFS localmente, ao acessar /webui na interface da web, você verá um erro de conexão:

IPFS sem dor (mas isso não é preciso)

O fato é que o webui, na minha opinião, funciona de forma muito ambígua. Primeiro, ele tenta se conectar à API do servidor onde a interface está aberta (com base no endereço do navegador, é claro). e se não funcionar lá, ele tenta se conectar ao gateway local. E se você tiver IPFS rodando localmente, então o webui funcionará bem para você, somente você trabalhará com IPFS local, e não externo, embora tenha aberto o webui em um servidor externo. Aí você carrega os arquivos, mas por algum motivo você não os vê assim em um servidor externo…

E se não estiver rodando localmente, teremos um erro de conexão. No nosso caso, o erro provavelmente se deve ao CORS, que também é indicado pelo webui, sugerindo adicionar um config.

ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["http://ip_вашего сервера:5001", "http://127.0.0.1:5001", "https://webui.ipfs.io"]'
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '["PUT", "GET", "POST"]'

Acabei de registrar um curinga

ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["*"]'

Os cabeçalhos adicionados podem ser encontrados no mesmo ~/.ipfs/config. No meu caso é

  "API": {
    "HTTPHeaders": {
      "Access-Control-Allow-Origin": [
        "*"
      ]
    }
  },

Reiniciamos o ipfs e vemos que o webui se conectou com sucesso (em qualquer caso, deveria, se você abriu os gateways para solicitações externas, conforme descrito acima).

Agora você pode fazer upload de pastas e arquivos diretamente pela interface web, bem como criar suas próprias pastas.

Montando o sistema de arquivos FUSE

Aqui está um recurso bastante interessante.

Arquivos (assim como pastas), podemos adicionar não só através da interface web, mas também diretamente no terminal, por exemplo

ipfs add test -r
added QmfYuz2gegRZNkDUDVLNa5DXzKmxxxxxxxxxx test/test.txt
added QmbnzgRVAP4fL814h5mQttyqk1aURxxxxxxxxxxxx test

O último hash é o hash da pasta raiz.

Usando esse hash, podemos abrir uma pasta em qualquer nó ipfs (que pode encontrar nosso nó e obter o conteúdo), podemos na interface web na porta 5001 ou 8080, ou podemos localmente via ipfs.

ipfs ls QmbnzgRVAP4fL814h5mQttyqk1aUxxxxxxxxxxxxx
QmfYuz2gegRZNkDUDVLNa5DXzKmKVxxxxxxxxxxxxxx 10 test.txt

Mas você ainda pode abri-lo como uma pasta normal.

Vamos criar duas pastas na raiz e conceder direitos a elas ao nosso usuário.

sudo mkdir /ipfs /ipns
sudo chown USERNAME /ipfs /ipns

e reinicie o ipfs com o sinalizador --mount

ipfs daemon --mount

Você pode criar pastas em outros locais e especificar o caminho para elas por meio dos parâmetros do daemon ipfs -mount -mount-ipfs /ipfs_path -mount-ipns /ipns_path

Agora, a leitura desta pasta é um tanto incomum.

ls -la /ipfs
ls: reading directory '/ipfs': Operation not permitted
total 0

Ou seja, não há acesso direto à raiz desta pasta. Mas você pode obter o conteúdo conhecendo o hash.

ls -la /ipfs/QmbnzgRVAP4fL814h5mQttyqxxxxxxxxxxxxxxxxx
total 0
-r--r--r-- 1 root root 10 Aug 31 07:03 test.txt

cat /ipfs/QmbnzgRVAP4fL814h5mQttyqxxxxxxxxxxxxxxxxx/test.txt 
test
test

Ao mesmo tempo, até o preenchimento automático funciona dentro da pasta quando o caminho é especificado.

Como eu disse acima, existem sutilezas nessa montagem: por padrão, as pastas FUSE montadas estão disponíveis apenas para o usuário atual (mesmo o root não será capaz de ler essa pasta, sem mencionar outros usuários do sistema). Se você deseja disponibilizar essas pastas para outros usuários, então na configuração você precisa alterar "FuseAllowOther": false para "FuseAllowOther": true. Mas isso não é tudo. Se você executar o IPFS como root, estará tudo bem. E se for em nome de um usuário comum (mesmo sudo), você receberá um erro

mount helper error: fusermount: option allow_other only allowed if 'user_allow_other' is set in /etc/fuse.conf

Neste caso, você precisa editar /etc/fuse.conf descomentando a linha #user_allow_other.

Depois disso, reinicie o ipfs.

Problemas conhecidos com FUSE

O problema foi percebido mais de uma vez: após reiniciar o ipfs com montagem (e talvez em outros casos), os pontos de montagem /ipfs e /ipns ficam indisponíveis. Não há acesso a eles e ls -la /ipfs mostra ???? na lista de direitos.

Encontrei esta solução:

fusermount -z -u /ipfs
fusermount -z -u /ipns

Em seguida, reinicie o ipfs.

Adicionando um serviço

Claro, rodar no terminal só é adequado para testes iniciais. No modo de combate, o daemon deve iniciar automaticamente na inicialização do sistema.

Em nome do sudo, crie o arquivo /etc/systemd/system/ipfs.service e escreva nele:

[Unit]
Description=IPFS Daemon
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=simple
ExecStart=/home/USERNAME/work/bin/ipfs daemon --mount
User=USERNAME
Restart=always

[Install]
WantedBy=multi-user.target

USERNAME, é claro, deve ser substituído pelo seu usuário (e talvez o caminho completo para o programa ipfs seja diferente para você (você deve especificar o caminho completo)).

Ativamos o serviço.

sudo systemctl enable ipfs.service

Iniciamos o serviço.

sudo service ipfs start

Verificando o status do serviço.

sudo service ipfs status

Para a pureza do experimento, será possível reinicializar o servidor no futuro para verificar se o ipfs inicia automaticamente com sucesso.

Adicionando festas conhecidas por nós

Considere uma situação em que temos nós IPFS instalados em um servidor externo e localmente. Em um servidor externo, adicionamos algum arquivo e tentamos obtê-lo via IPFS localmente por CID. O que vai acontecer? É claro que o servidor local provavelmente não sabe nada sobre nosso servidor externo e simplesmente tentará encontrar o arquivo por CID “perguntando” a todos os pares IPFS disponíveis (com os quais já conseguiu “se familiarizar”). Esses, por sua vez, perguntarão aos outros. E assim por diante, até que o arquivo seja encontrado. Na verdade, a mesma coisa acontece quando tentamos passar o arquivo pelo gateway oficial ipfs.io. Se você tiver sorte, o arquivo será encontrado em alguns segundos. E se não, não será encontrado nem em poucos minutos, o que prejudica muito o conforto do trabalho. Mas sabemos onde esse arquivo aparecerá pela primeira vez. Então, por que não dizemos imediatamente ao nosso servidor local "Pesquise lá primeiro"? Aparentemente, isso pode ser feito.

1. Vamos para o servidor remoto e olhamos na configuração ~/.ipfs/config

"Identity": {
    "PeerID": "QmeCWX1DD7HnPSuMHZSh6tFuxxxxxxxxxxxxxxxx",

2. Execute sudo service ipfs status e procure por entradas do Swarm nele, por exemplo:

Swarm announcing /ip4/ip_вашего_сервера/tcp/4001

3. Adicionamos a partir disso o endereço geral no formato "/ip4/ip_your_server/tcp/4001/ipfs/$PeerID".

4. Para maior confiabilidade, tentaremos adicionar esse endereço aos pares por meio de nosso webui local.

IPFS sem dor (mas isso não é preciso)

5. Se tudo estiver bem, abra a configuração local ~/.ipfs/config, encontre “Bootstrap” nele: [...
e adicione o endereço recebido primeiro ao array.

Reinicie o IPFS.

Agora vamos adicionar o arquivo ao servidor externo e tentar solicitá-lo no servidor local. Deve voar rápido.

Mas esta funcionalidade ainda não está estável. Pelo que entendi, mesmo que especifiquemos o endereço de um peer no Bootstrap, o ipfs altera a lista de conexões ativas com peers durante a operação. De qualquer forma, está em andamento a discussão sobre isso e os desejos quanto à possibilidade de especificar festas permanentes aqui e parece que deveria adicione alguma funcionalidade a [email protegido]+

A lista de peers atuais pode ser visualizada tanto na webui quanto no terminal.

ipfs swarm peers

E aqui e ali você pode adicionar seu banquete manualmente.

ipfs swarm connect "/ip4/ip_вашего_сервера/tcp/4001/ipfs/$PeerID"

Até que esta funcionalidade seja melhorada, você pode escrever uma ferramenta para verificar uma conexão com o peer desejado e, se não, adicionar uma conexão.

Raciocínio

Entre aqueles que já estão familiarizados com o IPFS, existem argumentos a favor e contra o IPFS. Basicamente, ontem discussão e me levou a pesquisar o IPFS novamente. E com relação à discussão mencionada acima: não posso dizer que me oponho fortemente a qualquer argumento dos que falaram (discordo apenas do fato de um programador e meio usar IPFS). Em geral, ambos estão certos à sua maneira (especialmente comentar sobre cheques faz você pensar). Mas se descartarmos a avaliação moral e jurídica, quem fará a avaliação técnica desta tecnologia? Pessoalmente, tenho uma sensação interior de que “isso deve ser feito de forma inequívoca, tem certas perspectivas”. Mas por que exatamente, não existe uma formulação clara. Por exemplo, se você observar as ferramentas centralizadas existentes, verá que, em muitos aspectos, elas estão muito à frente (estabilidade, velocidade, capacidade de gerenciamento, etc.). No entanto, tenho uma ideia que parece fazer sentido e que dificilmente poderá ser implementada sem esses sistemas descentralizados. É claro que estou exagerando, mas formularia desta forma: o princípio da divulgação de informações na Internet deve ser mudado.

Deixe-me explicar. Se você pensar bem, agora temos informações distribuídas de acordo com o princípio “Espero que aquele a quem as dei as proteja e que não sejam perdidas ou recebidas por aqueles a quem não foram destinadas”. Como exemplo, é fácil considerar vários serviços de correio, armazenamento em nuvem, etc. E com o que acabamos? No centro de Habré Segurança da informação está na primeira linha e quase todos os dias recebemos notícias sobre mais um vazamento global. Em princípio, todas as coisas mais interessantes estão listadas em <ironia> maravilhosa artigo O verão está quase acabando. Quase não há mais dados vazados. Ou seja, os principais gigantes da Internet estão se tornando maiores, acumulando cada vez mais informações, e esses vazamentos são uma espécie de explosões atômicas de informações. Isso nunca aconteceu antes e aqui está novamente. Ao mesmo tempo, embora muitos compreendam que existem riscos, continuarão a confiar os seus dados a empresas terceiras. Em primeiro lugar, não há muita alternativa e, em segundo lugar, prometem que taparam todos os buracos e que isso nunca mais acontecerá.

Que opção eu vejo? Parece-me que os dados deveriam inicialmente ser distribuídos abertamente. Mas abertura, neste caso, não significa que tudo deva ser fácil de ler. Estou falando da abertura de armazenamento e distribuição, mas não da abertura total na leitura. Presumo que as informações devam ser distribuídas com chaves públicas. Afinal, o princípio das chaves públicas/privadas já é antigo, quase como a Internet. Se a informação não for confidencial e se destinar a um amplo círculo, ela será imediatamente divulgada com uma chave pública (mas ainda de forma criptografada, qualquer pessoa pode descriptografá-la com a chave disponível). E se não, então é colocado sem chave pública, e a própria chave é transferida para quem deveria ter acesso a essa informação. Ao mesmo tempo, quem deveria lê-lo deveria ter apenas uma chave, e onde conseguir essa informação, ele não deveria realmente subir - ele apenas a puxa da rede (este é o novo princípio de distribuição por conteúdo, não por endereço).

Assim, para um ataque em massa, os invasores precisarão obter um grande número de chaves privadas, e é improvável que isso seja feito em um só lugar. Essa tarefa, a meu ver, é mais difícil do que hackear um serviço específico.

E aqui se encerra outro problema: a confirmação da autoria. Agora na Internet você pode encontrar muitas citações escritas por nossos amigos. Mas onde está a garantia de que foram eles que os escreveram? Agora, se cada registro desse tipo fosse acompanhado de uma assinatura digital, seria muito mais fácil. E não importa onde esteja essa informação, o principal é a assinatura, que, claro, é difícil de falsificar.

E aqui está o que é interessante: o IPFS já possui ferramentas de criptografia (afinal, ele é baseado na tecnologia blockchain). A chave privada é imediatamente especificada na configuração.

  "Identity": {
    "PeerID": "QmeCWX1DD7HnPSuMHZSh6tFuMxxxxxxxxxxxxxx",
    "PrivKey": "CAASqAkwggSkAgEAAoIBAQClZedVmj8JkPvT92sGrNIQmofVF3ne8xSWZIGqkm+t9IHNN+/NDI51jA0MRzpBviM3o/c/Nuz30wo95vWToNyWzJlyAISXnUHxnVhvpeJAbaeggQRcFxO9ujO9DH61aqgN1m+JoEplHjtc4KS5
pUEDqamve+xAJO8BWt/LgeRKA70JN4hlsRSghRqNFFwjeuBkT1kB6tZsG3YmvAXJ0o2uye+y+7LMS7jKpwJNJBiFAa/Kuyu3W6PrdOe7SqrXfjOLHQ0uX1oYfcqFIKQsBNj/Fb+GJMiciJUZaAjgHoaZrrf2b/Eii3z0i+QIVG7OypXT3Z9JUS60
KKLfjtJ0nVLjAgMBAAECggEAZqSR5sbdffNSxN2TtsXDa3hq+WwjPp/908M10QQleH/3mcKv98FmGz65zjfZyHjV5C7GPp24e6elgHr3RhGbM55vT5dQscJu7SGng0of2bnzQCEw8nGD18dZWmYJsE4rUsMT3wXxhUU4s8/Zijgq27oLyxKNr9T7
2gxqPCI06VTfMiCL1wBBUP1wHdFmD/YLJwOjV/sVzbsl9HxqzgzlDtfMn/bJodcURFI1sf1e6WO+MyTc3.................

Não sou especialista em segurança e não sei exatamente como usá-las corretamente, mas me parece que essas chaves são usadas no nível de troca entre nós IPFS. E também js-ipfs e exemplos de projetos como órbita-dbem que funciona órbita.chat. Ou seja, teoricamente, cada dispositivo (móvel e não só) pode ser facilmente equipado com suas próprias máquinas de criptografia-descriptografia. Nesse caso, resta apenas a todos cuidar de salvar suas chaves privadas, e cada um será responsável por sua própria segurança, e não ficará refém de outro fator humano de algum gigante superpopular da Internet.

Apenas usuários registrados podem participar da pesquisa. Entrarpor favor

Você já ouviu falar sobre IPFS antes?

  • Nunca ouvi falar de IPFS, mas parece interessante

  • Não ouvi e não quero ouvir

  • Ouvi mas não estou interessado

  • Ouvi, mas não entendi, mas agora parece interessante

  • Tenho usado ativamente o IPFS há muito tempo.

69 usuários votaram. 13 usuários se abstiveram.

Fonte: habr.com

Adicionar um comentário