IPFS sin dolor (pero esto no es exacto)

IPFS sin dolor (pero esto no es exacto)

A pesar de que Habré ya estaba más de un artículo sobre IPFS.

Aclararé de inmediato que no soy un experto en esta área, pero he mostrado interés en esta tecnología más de una vez, pero tratar de jugar con ella a menudo causaba algo de dolor. Hoy comencé a experimentar nuevamente y obtuve algunos resultados que me gustaría compartir. En resumen, se describirá el proceso de instalación de IPFS y algunas características (todo se hizo en ubuntu, no lo he probado en otras plataformas).

Si se perdió lo que es IPFS, está escrito con cierto detalle aquí: habr.com/es/post/314768

Instalación

Para la pureza del experimento, sugiero instalarlo inmediatamente en algún servidor externo, ya que consideraremos algunos inconvenientes al trabajar en modo local y remoto. Luego, si lo desea, no será demolido por mucho tiempo, no hay mucho.

instalar ir

Documentación oficial
Ver la versión actual en golang.org/dl

Nota: es mejor instalar IPFS en nombre del usuario que se supone que debe usarlo con más frecuencia. El hecho es que a continuación consideraremos la opción de montaje a través de FUSIBLE y hay 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

Luego necesita actualizar el entorno (más detalles aquí: 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

Comprobando que go está instalado

go version

Instalar IPFS

Me gustó más el método de instalación. actualización de ipfs.

Instálalo con el comando

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

Después de eso, puede ejecutar los siguientes comandos:

Versiones de actualización de ipfs - para ver todas las versiones disponibles para descargar.
versión actualizada de ipfs - para ver la versión instalada actualmente (hasta que no tengamos IPFS instalado, será ninguno).
ipfs-update instalar lo último - instalar la última versión de IPFS. En lugar de la última, respectivamente, puede especificar cualquier versión deseada de la lista de disponibles.

Instalación de ipfs

ipfs-update install latest

Cheque

ipfs --version

Directamente con la instalación en términos generales todo.

Iniciar IPFS

Inicialización

Primero debe realizar la inicialización.

ipfs init

En respuesta, recibirás algo como esto:

 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

Puede ejecutar el 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

Aquí, en mi opinión, comienza lo interesante. Los muchachos en la etapa de instalación ya están comenzando a usar sus propias tecnologías. El hash propuesto QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv no se genera específicamente para usted, sino que se incluye en la versión. Es decir, antes del lanzamiento, prepararon un texto de bienvenida, lo vertieron en IPFS y agregaron la dirección al instalador. Creo que es muy bueno. Y este archivo (más precisamente, la carpeta completa) ahora se puede ver no solo localmente, sino también en la puerta de enlace oficial. ipfs.io/ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv. Al mismo tiempo, puede estar seguro de que el contenido de la carpeta no ha cambiado de ninguna manera, porque si hubiera cambiado, el hash también habría cambiado.

Por cierto, en este caso, IPFS tiene algunas similitudes con el servidor de control de versiones. Si realiza cambios en los archivos de origen de la carpeta y vuelve a verter la carpeta en IPFS, recibirá una nueva dirección. Al mismo tiempo, la carpeta anterior no irá a ningún lado así como así y estará disponible en su dirección anterior.

Lanzamiento directo

ipfs daemon

Deberías recibir una respuesta 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

Abriendo las puertas a Internet

Presta atención a estas dos líneas:

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

Ahora, si instaló IPFS localmente, accederá a las interfaces de IPFS usando direcciones locales y todo estará disponible para usted (por ejemplo, localhost:5001/webui/). Pero cuando se instala en un servidor externo, por defecto, las puertas de enlace están cerradas a Internet. Pasarelas dos:

  1. administrador webui (gitHub) en el puerto 5001.
  2. API externa en el puerto 8080 (solo lectura).

Hasta ahora, ambos puertos (5001 y 8080) pueden abrirse para experimentos, pero en un servidor de combate, por supuesto, el puerto 5001 debe cerrarse con un firewall. También está el puerto 4001, que es necesario para que otros pares puedan encontrarlo. Debe dejarse abierto a solicitudes externas.

Abra ~/.ipfs/config para editar y busque estas líneas en él:

"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"
}

Cambie 127.0.0.1 a la ip de su servidor y guarde el archivo, luego reinicie ipfs (detenga el comando en ejecución con Ctrl+C y vuelva a iniciarlo).

Debería obtener

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

Ahora las interfaces externas deberían estar disponibles.

verificar

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

El archivo Léame anterior debería abrirse.

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

La interfaz web debería abrirse.

Si webui funciona para usted, entonces la configuración de IPFS se puede cambiar directamente en él, incluida la visualización de estadísticas, pero a continuación consideraré las opciones de configuración directamente a través del archivo de configuración, que generalmente no es crítico. Es mejor recordar exactamente dónde está la configuración y qué hacer con ella, de lo contrario, si la cara web no funciona, será más difícil.

Configuración de una interfaz web para trabajar con su servidor

Aquí está la primera trampa, que tomó alrededor de tres horas.

Si instaló IPFS en un servidor externo, pero no instaló ni ejecutó IPFS localmente, cuando vaya a /webui en la interfaz web, debería ver un error de conexión:

IPFS sin dolor (pero esto no es exacto)

El hecho es que webui, en mi opinión, funciona de manera muy ambigua. Primero, intenta conectarse a la API del servidor donde está abierta la interfaz (basándose en la dirección en el navegador, por supuesto). y si no funciona allí, intenta conectarse a la puerta de enlace local. Y si tiene IPFS ejecutándose localmente, entonces webui funcionará bien para usted, solo trabajará con IPFS local y no externo, aunque abrió webui en un servidor externo. Luego subes los archivos, pero por alguna razón no los ves así en un servidor externo…

Y si no se ejecuta localmente, obtenemos un error de conexión. En nuestro caso, lo más probable es que el error se deba a CORS, que también lo indica webui, lo que sugiere agregar un archivo 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"]'

Acabo de registrar un comodín

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

Los encabezados agregados se pueden encontrar en el mismo ~/.ipfs/config. en mi caso es

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

Reiniciamos ipfs y vemos que webui se ha conectado correctamente (en cualquier caso, debería hacerlo, si abriste las puertas de enlace para solicitudes externas, como se describe anteriormente).

Ahora puede cargar carpetas y archivos directamente a través de la interfaz web, así como crear sus propias carpetas.

Montaje del sistema de archivos FUSE

Aquí hay una característica bastante interesante.

Archivos (así como carpetas), podemos agregar no solo a través de la interfaz web, sino también directamente en la terminal, por ejemplo

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

El último hash es el hash de la carpeta raíz.

Usando este hash, podemos abrir una carpeta en cualquier nodo ipfs (que puede encontrar nuestro nodo y obtener el contenido), podemos hacerlo en la interfaz web en el puerto 5001 u 8080, o podemos hacerlo localmente a través de ipfs.

ipfs ls QmbnzgRVAP4fL814h5mQttyqk1aUxxxxxxxxxxxxx
QmfYuz2gegRZNkDUDVLNa5DXzKmKVxxxxxxxxxxxxxx 10 test.txt

Pero aún puede abrirlo como una carpeta normal.

Vamos a crear dos carpetas en la raíz y concederles derechos a nuestro usuario.

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

y reinicie ipfs con la bandera --mount

ipfs daemon --mount

Puede crear carpetas en otros lugares y especificar la ruta a ellas a través de los parámetros del demonio ipfs -mount -mount-ipfs /ipfs_path -mount-ipns /ipns_path

Ahora, leer de esta carpeta es algo inusual.

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

Es decir, no hay acceso directo a la raíz de esta carpeta. Pero puedes obtener el contenido, conociendo el 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

Al mismo tiempo, incluso el autocompletado funciona dentro de la carpeta cuando se especifica la ruta.

Como dije anteriormente, hay sutilezas con dicho montaje: por defecto, las carpetas FUSE montadas están disponibles solo para el usuario actual (incluso el root no podrá leer desde dicha carpeta, sin mencionar a otros usuarios en el sistema). Si desea que estas carpetas estén disponibles para otros usuarios, entonces en la configuración debe cambiar "FuseAllowOther": false a "FuseAllowOther": true. Pero eso no es todo. Si ejecuta IPFS como root, entonces todo está bien. Y si en nombre de un usuario normal (incluso sudo), obtendrá un error

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

En este caso, debe editar /etc/fuse.conf descomentando la línea #user_allow_other.

Después de eso, reinicie ipfs.

Problemas conocidos con FUSE

El problema se ha notado más de una vez que después de reiniciar ipfs con el montaje (y tal vez en otros casos), los puntos de montaje /ipfs y /ipns dejan de estar disponibles. No hay acceso a ellos, y ls -la /ipfs muestra ???? en la lista de derechos.

Encontré esta solución:

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

Luego reinicie ipfs.

Agregar un servicio

Por supuesto, ejecutar en la terminal solo es adecuado para pruebas iniciales. En el modo de combate, el demonio debería iniciarse automáticamente al iniciar el sistema.

En nombre de sudo, cree el archivo /etc/systemd/system/ipfs.service y escríbalo:

[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

NOMBRE DE USUARIO, por supuesto, debe ser reemplazado con su usuario (y quizás la ruta completa al programa ipfs sea diferente para usted (debe especificar la ruta completa)).

Activamos el servicio.

sudo systemctl enable ipfs.service

Iniciamos el servicio.

sudo service ipfs start

Comprobación del estado del servicio.

sudo service ipfs status

Para la pureza del experimento, será posible reiniciar el servidor en el futuro para comprobar que ipfs se inicia correctamente de forma automática.

Agregar fiestas conocidas para nosotros

Considere una situación en la que tenemos nodos IPFS instalados tanto en un servidor externo como localmente. En un servidor externo, agregamos algún archivo e intentamos obtenerlo a través de IPFS localmente por CID. ¿Lo que sucederá? Por supuesto, lo más probable es que el servidor local no sepa nada sobre nuestro servidor externo y simplemente intente encontrar el archivo por CID "preguntando" a todos los pares de IPFS disponibles (con los que ya ha logrado "familiarizarse"). Éstos a su vez preguntarán a otros. Y así sucesivamente, hasta encontrar el archivo. En realidad, sucede lo mismo cuando intentamos obtener el archivo a través de la puerta de enlace oficial. ipfs.io. Si tiene suerte, el archivo se encontrará en unos segundos. Y si no, no se encontrará ni en unos minutos, lo que afecta en gran medida a la comodidad del trabajo. Pero sabemos dónde aparecerá este archivo por primera vez. Entonces, ¿por qué no le decimos inmediatamente a nuestro servidor local "Busca allí primero"? Aparentemente, esto se puede hacer.

1. Vamos al servidor remoto y buscamos en el ~/.ipfs/config config

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

2. Ejecute sudo service ipfs status y busque entradas de Swarm en él, por ejemplo:

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

3. Agregamos a partir de esto la dirección general de la forma "/ip4/ip_su_servidor/tcp/4001/ipfs/$PeerID".

4. Para mayor confiabilidad, intentaremos agregar esta dirección a los pares a través de nuestra webui local.

IPFS sin dolor (pero esto no es exacto)

5. Si todo está bien, abra la configuración local ~ / .ipfs / config, busque "Bootstrap" en ella: [...
y agregue la dirección recibida primero a la matriz.

Reinicie IPFS.

Ahora agreguemos el archivo al servidor externo e intentemos solicitarlo en el servidor local. Debería volar rápido.

Pero esta funcionalidad aún no es estable. Según tengo entendido, incluso si especificamos la dirección de un par en Bootstrap, ipfs cambia la lista de conexiones activas con los pares durante la operación. En todo caso, está en curso la discusión de este y deseos respecto a la posibilidad de concretar fiestas permanentes. aquí y parece que se supone que añadir alguna funcionalidad a [email protected]+

La lista de pares actuales se puede ver tanto en webui como en la terminal.

ipfs swarm peers

Y aquí y allá puedes agregar tu fiesta manualmente.

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

Hasta que se haya mejorado esta funcionalidad, puede escribir una herramienta para verificar una conexión con el par deseado y, si no, agregar una conexión.

Razonamiento

Entre aquellos que ya están familiarizados con IPFS, hay argumentos a favor y en contra de IPFS. Básicamente, ayer discusión y me incitó a profundizar en IPFS nuevamente. Y con respecto a la discusión mencionada anteriormente: no puedo decir que me oponga firmemente a ningún argumento de los que hablaron (solo estoy en desacuerdo con el hecho de que un programador y medio usa IPFS). En general, ambos tienen razón a su manera (especialmente comentario sobre cheques te hace pensar). Pero si descartamos la valoración moral y jurídica, ¿quién dará una valoración técnica de esta tecnología? Personalmente, tengo una especie de sentimiento interno de que "esto debe hacerse de manera inequívoca, tiene ciertas perspectivas". Pero por qué exactamente, no hay una formulación clara. Por ejemplo, si observa las herramientas centralizadas existentes, en muchos aspectos están muy por delante (estabilidad, velocidad, capacidad de administración, etc.). Sin embargo, tengo una idea que parece tener sentido y que difícilmente puede implementarse sin tales sistemas descentralizados. Por supuesto, me estoy balanceando demasiado, pero lo formularía de esta manera: el principio de difusión de información en Internet debe cambiarse.

Dejame explicar. Si lo piensas bien, ahora tenemos información distribuida según el principio “Espero que aquel a quien se la di la proteja y no se pierda ni la reciban aquellos a quienes no estaba destinada”. Como ejemplo, es fácil considerar varios servicios de correo, almacenamiento en la nube, etc. ¿Y con qué terminamos? En el eje de Habré Seguridad de la información está en primera línea y casi todos los días recibimos noticias sobre otra fuga mundial. En principio, todas las cosas más interesantes se enumeran en <ironía> maravilloso artículo El verano casi termina. Casi no quedan datos sin filtrar. Es decir, los principales gigantes de Internet son cada vez más grandes, acumulan cada vez más información y esas filtraciones son una especie de explosiones atómicas de información. Esto nunca ha sucedido antes, y aquí está de nuevo. Al mismo tiempo, aunque muchos entienden que existen riesgos, seguirán confiando sus datos a terceras empresas. En primer lugar, no hay muchas alternativas y, en segundo lugar, prometen que han reparado todos los agujeros y que esto nunca volverá a suceder.

¿Qué opción veo? Me parece que los datos inicialmente deberían distribuirse abiertamente. Pero la apertura en este caso no significa que todo deba ser fácil de leer. Hablo de la apertura del almacenamiento y la distribución, pero no de la apertura total en la lectura. Supongo que la información debe distribuirse con claves públicas. Después de todo, el principio de claves públicas/privadas ya es antiguo, casi como Internet. Si la información no es confidencial y está destinada a un círculo amplio, entonces se presenta de inmediato con una clave pública (pero aún en forma cifrada, cualquiera puede descifrarla con la clave disponible). Y si no, se presenta sin una clave pública, y la clave misma se transfiere a lo que debería tener acceso a esta información. Al mismo tiempo, quien debe leerlo solo debe tener una clave, y dónde obtener esta información, en realidad no debe dispararse, simplemente la extrae de la red (este es el nuevo principio de distribución por contenido, no por DIRECCIÓN).

Por lo tanto, para un ataque masivo, los atacantes deberán obtener una gran cantidad de claves privadas, y es poco probable que esto se haga en un solo lugar. Esta tarea, tal como yo la veo, es más difícil que hackear un servicio en particular.

Y aquí se cierra otro problema: la confirmación de la autoría. Ahora en Internet puedes encontrar muchas citas escritas por nuestros amigos. Pero, ¿dónde está la garantía de que fueron ellos quienes las escribieron? Ahora, si cada registro de este tipo fuera acompañado de una firma digital, sería mucho más fácil. Y no importa dónde se encuentre esta información, lo principal es la firma, que, por supuesto, es difícil de falsificar.

Y esto es lo que es interesante: IPFS ya cuenta con herramientas de encriptación (después de todo, se basa en la tecnología blockchain). La clave privada se especifica inmediatamente en la configuración.

  "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.................

No soy un especialista en seguridad y no puedo saber exactamente cómo usarlo correctamente, pero me parece que estas claves se usan a nivel de intercambio entre los nodos de IPFS. Y también js-ipfs y ejemplos de proyectos como órbita-dben el que funciona órbita.chat. Es decir, en teoría, cada dispositivo (móvil y no solo) puede equiparse fácilmente con sus propias máquinas de cifrado y descifrado. En este caso, solo queda que cada uno se encargue de guardar sus claves privadas, y cada uno será responsable de su propia seguridad, y no será rehén de otro factor humano en algún gigante de Internet superpopular.

Solo los usuarios registrados pueden participar en la encuesta. Registrarsepor favor

¿Ha oído hablar de IPFS antes?

  • Nunca he oído hablar de IPFS, pero me parece interesante.

  • No he oído y no quiero oír

  • Escuché pero no me interesó

  • Escuché, pero no entendí, pero ahora parece interesante

  • He estado usando activamente IPFS durante mucho tiempo.

69 usuarios votaron. 13 usuarios se abstuvieron.

Fuente: habr.com

Añadir un comentario