Reading time: < 1 minute Després de que diverses persones m'ho demanessin fa un mes més o menys em vaig donar d'alta al directori de podcasts del iTunes. Així doncs, els que tingueu un iPhone, iPad o qualsevol altre andromina compatible amb iTunes podrà localitar el meu podcast buscant simplement 'oriolrius.cat', l'enllaç cap a la pàgina del podcast:
Category Archives: podcast
Podcast 2×06: Com funciona Kerberos? autenticació i autorització (AA)
Reading time: 4 – 6 minutes
El podcast
[display_podcast]
Notes
Estàndard RFC1510 per l’autenticació, destaquen les funcionalitats de:
- autenticació mutua
- temps de connexió ràpids (session tickets)
- delegació (autenticació recursiva entre serveis)
Esquemes
Simplifiació del funcionament
Hi ha 6 tipus de missatges (5 obligatoris + 1 opcional), agrupats en 3 su-protocols:
- AS (Authentication Service) – es produeix durant el procés de “login” i li permet al client poder demanar un ticket per accedir als recursos (TGT)
- KRB_AS_REP
- Client principal name.
- Timestamp.
- Kerberos target principle name (realm).
- Requested lifetime.
- KRB_AS_REP
- La primera part va xifrada usant la clau d’usuari, conté:
- User-TGS key (generated by the KDC).
- Kerberos target principle name (realm).
- Ticket lifetime.
- La segona part és el TGT, va xifrat usant la clau TGS generada pel KDC només els servidor la poden obrir, malgrat això s’enmagatzema en el client i conté:
- Client principal name.
- Ticket lifetime.
- KDC timestamp.
- User-TGS key (which is not retained by the KDC, but its presence within the TGT means it is available when required).
- Client IP address (taken from the initial KRB_AS_REQ).
- La primera part va xifrada usant la clau d’usuari, conté:
- KRB_AS_REP
- TGS (Ticket Granting Service) – a través del TGT el client poy demanar un “service ticket” (ST) necessari per poder accedir a un servei. El TGT té un funcionament semblant al d’un password (expira amb el temps i no requereix password), el ST obtingut seria semblant a un visat d’accés a un país.
- KRB_TGS_REQ
- Service principal name.
- Requested lifetime.
- TGT (still encrypted with the TGS key).
- Authenticator (encrypted with the user-TGS key and containing a client timestamp) – The authenticator guarantees that the request originated from the client.
- KRB_TGS_REP
- La primera part va xifrada amb la clau TGS de l’usuari (el KDC l’extreu del TGT) i conté:
- Service principal name.
- Ticket lifetime.
- User service key (encrypted with a user-TGS session key, generated by the KDC).
- Part dos, és el “service ticket” (ST). Xifrat usant la clau del servei TGS. Conté:
-
- User service key (encrypted with a user-TGS session key, generated by the KDC).
- Client principal name.
- Ticket lifetime.
- KDC timestamp.
- Client IP address.
- La primera part va xifrada amb la clau TGS de l’usuari (el KDC l’extreu del TGT) i conté:
- KRB_TGS_REQ
- Client/Server (AP) Exchange – per accedir a un servei el client envia al servei un KRB_AP_REQ amb el ST obtingut. El servei pot o no contestar la petició, a vegades, el servei directament comença la seva sessió.
- KRB_AP_REQ
- ST xifrat amb la clau TGS del servei
- Authenticator – encrypted with the user service key
- KRB_AP_REP
- KRB_AP_REQ
Característiques
- ‘Realm‘ es defineix com un domini d’aministració
- Tots els servidors i participants en les transaccions pertanyen al mateix ‘Realm’
- Tots els missatges viatgen xifrats usant un codi simètric (no-PKI)
- La “user key” es genera a partir del “logon password”
- La “host key” es genera quan el “host” s’uneix al ‘Realm’
- Si un client vol accedir a un servei i no ha fet el TGS pot enviar el TGT en el “AP exchange” i el servei farà la gestió amb el KDC de forma transparent.
- Important recordar que:
- només el KDC pot llegir el TGT
- només el servei pot llegir el ST
Glossari d’acrònims
- KDC: Key Distribution Center
- AS: Authentication Service
- TGS: Ticket Granting Service
- SS: Service Server
Referències:
Error coneguts
- Degut a un error el podcast 2×05 no exiteix. Sento l’error!
Podcast 2×04: SSH avançat
Reading time: 3 – 5 minutes
El podcast
[display_podcast]
Notes sobre el podcast
- -L: connecta per SSH a un HOST Un cop allà obre una connexió TCP a un altre HOST:PORT i obre un port TCP local que al connectar-hi ens envia al HOST:PORT anteriors, o sigui, portforwarding.
- -L [bind_address:]port:host:hostport]
- -W: connecta per SSH a un HOST un cop allà obre una connexió TCP a un altre HOST:PORT i ens retorna a la stdin/stdout el contingut d’aquest darrer enllaç TCP
- -W host:hostport
- -R publicar un port: connecta per SSH a un host i un cop allà publica un port TCP, quan un client es connecta a aquest port TCP accedeix per SSH a la màquina que ha llença l’enllaç SSH i obre un altre enllaç TCP a una altre IP:PORT.
- -R[bind_address:]port:host:hostport
- -D socks5: connecta per SSH a un HOST i després publica un port SOCKS5/TCP, és a dir, que podem connectar a aquest port local i sortir a internet a través de la IP del HOST on hem connectat per SSH
- -D [bind_address:]port
- -w tunel: connecta per SSH a un HOST i el socket que s’ha usat per fer l’enllaç SSH es connecta a dues interficies de tipus TUN, una a cada extrem del socket. Així doncs, si configurem les corresponents IPs a les interficies TUN tenim un tunel/VPN montada entre els extrems.
- -w local_tun[:remote_tun]
HPN-SSH
La web de: HPN-SSH -> especialment interessant: Dynamic Windows and None Cipher
- treballa amb mida de finestra dinàmica
- treballa sense xifrat quan un enllaç no té terminal associat, sovint usat per pas de fitxers
Les proves:
- Openssh 5.3p1 + hpn-13 (només el patch: Dynamic Windows and None Cipher)
- després d’aplicar el patch: openssh5.3-dynwindow_noneswitch.diff.gz
- modifiquem el fitxer: sshconnect2.c
linia: 366 - if (!tty_flag) /* no null on tty sessions */ + if (1) /* no null on tty sessions */
- així podem fer SSH sense xifrar només després d’haver fet el login.
exemple ampla de banada d’un SSH amb xifrat aes128-ctr, usant finestra dinàmica:
scp -v -oNoneEnabled=no -oNoneSwitch=yes fitxer root@127.0.0.1:/tmp/ssh o ssh -v -oNoneEnabled=no -oNoneSwitch=yes root@127.0.0.1 "dd if=/dev/zero"|pv > /dev/null velocitat de transferència: 13.7MB/s
- debug ciphers, una única negociació de ciphers:
debug1: AUTH STATE IS 0 debug1: REQUESTED ENC.NAME is 'aes128-ctr' debug1: kex: server->client aes128-ctr hmac-md5 none debug1: REQUESTED ENC.NAME is 'aes128-ctr' debug1: kex: client->server aes128-ctr hmac-md5 none
exemple sense xifrat, usant finestra dinàmica:
scp -v -oNoneEnabled=yes -oNoneSwitch=yes fitxer root@127.0.0.1:/tmp/ssh o ssh -v -oNoneEnabled=yes -oNoneSwitch=yes root@127.0.0.1 "dd if=/dev/zero"|pv > /dev/null velocitat de transferència: 37.4MB/s
- abans del pass de login:
debug1: AUTH STATE IS 0 debug1: REQUESTED ENC.NAME is 'aes128-ctr' debug1: kex: server->client aes128-ctr hmac-md5 none debug1: REQUESTED ENC.NAME is 'aes128-ctr' debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: AUTH STATE IS 1 debug1: REQUESTED ENC.NAME is 'none' debug1: Requesting NONE. Authflag is 1 debug1: None requested post authentication. debug1: kex: server->client none hmac-md5 none debug1: REQUESTED ENC.NAME is 'none' debug1: Requesting NONE. Authflag is 1 debug1: None requested post authentication. debug1: kex: client->server none hmac-md5 none
Podcast 2×03: eines per jugar amb SOCKS5
Reading time: 1 – 2 minutes
Finalment l’última entrega de la trilogia de podcasts sobre SOCKS. Com indica el títol i podeu veure amb els links aquest parla d’eines per montar servidors SOCKS i wrappers per montar clients SOCKS5.
El podcast:
[display_podcast]
Referències:
- Apunts per fer el podcast: fitxer .txt amb les meves notes per fer el podcast, mig en català i anglès.
- Servidors:
- Clients/Wrappers/Proxifiers:
- tsocks
- csocks
- connect-proxy
- proxychains
- SocksiPy (python)
- ICP (Internet Cache Protocol)
Podcast 2×02: SOCKS5 Bytestreams (XEP-0065)
Reading time: 4 – 7 minutes
La segona part sobre la trilogia de SOCKS5.
El podcast:
[display_podcast]
Exemples extrets del XEP-0065:
Example 1. Initiator Sends Service Discovery Request to Target
<iq type='get' from='initiator@example.com/foo' to='target@example.org/bar' id='hello'> <query xmlns='http://jabber.org/protocol/disco#info'/> </iq>
Example 2. Target Replies to Service Discovery Request
<iq type='result' from='target@example.org/bar' to='initiator@example.com/foo' id='hello'> <query xmlns='http://jabber.org/protocol/disco#info'> <identity category='proxy' type='bytestreams' name='SOCKS5 Bytestreams Service'/> <feature var='http://jabber.org/protocol/bytestreams'/> </query> </iq>
Example 3. Initiator Sends Service Discovery Request to Server
<iq type='get' from='initiator@example.com/foo' to='example.com' id='server_items'> <query xmlns='http://jabber.org/protocol/disco#items'/> </iq>
Example 4. Server Replies to Service Discovery Request
<iq type='result' from='example.com' to='initiator@example.com/foo' id='server_items'> <query xmlns='http://jabber.org/protocol/disco#items'> <item jid='streamhostproxy.example.net' name='Bytestreams Proxy'/> </query> </iq>
Example 5. Initiator Sends Service Discovery Request to Proxy
<iq type='get' from='initiator@example.com/foo' to='streamhostproxy.example.net' id='proxy_info'> <query xmlns='http://jabber.org/protocol/disco#info'/> </iq>
Example 6. Server Replies to Service Discovery Request
<iq type='result' from='streamhostproxy.example.net' to='initiator@example.com/foo' id='proxy_info'> <query xmlns='http://jabber.org/protocol/disco#info'> <identity category='proxy' type='bytestreams' name='SOCKS5 Bytestreams Service'/> <feature var='http://jabber.org/protocol/bytestreams'/> </query> </iq>
Example 7. Initiator Requests Network Address from Proxy
<iq type='get' from='initiator@example.com/foo' to='streamhostproxy.example.net' id='discover'> <query xmlns='http://jabber.org/protocol/bytestreams' sid='vxf9n471bn46'/> </iq>
Example 8. Proxy Informs Initiator of Network Address
<iq type='result' from='streamhostproxy.example.net' to='initiator@example.com/foo' id='discover'> <query xmlns='http://jabber.org/protocol/bytestreams'> sid='vxf9n471bn46'> <streamhost jid='streamhostproxy.example.net' host='24.24.24.1' p zeroconf='_jabber.bytestreams'/> </query> </iq>
Example 9. Proxy Returns Error to Initiator
<iq type='error' from='initiator@example.com/foo' to='streamhostproxy.example.net' id='discover'> <query xmlns='http://jabber.org/protocol/bytestreams' sid='vxf9n471bn46'/> <error code='403' type='auth'> <forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq>
Example 10. Proxy Returns Error to Initiator
<iq type='error' from='initiator@example.com/foo' to='streamhostproxy.example.net' id='discover'> <query xmlns='http://jabber.org/protocol/bytestreams' sid='vxf9n471bn46'/> <error code='405' type='cancel'> <not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq>
Example 11. Initiation of Interaction
<iq type='set' from='initiator@example.com/foo' to='target@example.org/bar' id='initiate'> <query xmlns='http://jabber.org/protocol/bytestreams' sid='vxf9n471bn46' mode='tcp'> <streamhost jid='initiator@example.com/foo' host='192.168.4.1' port='5086'/> <streamhost jid='streamhostproxy.example.net' host='24.24.24.1' zeroconf='_jabber.bytestreams'/> </query> </iq>
Example 12. Target Refuses Bytestream
<iq type='error' from='target@example.org/bar' to='initiator@example.com/foo' id='initiate'> <error code='406' type='auth'> <not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq>
Example 13. Target Is Unable to Connect to Any StreamHost and Wishes to End Transaction
<iq type='error' from='target@example.org/bar' to='initiator@example.com/foo' id='initiate'> <error code='404' type='cancel'> <item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq>
Example 16. Target Notifies Initiator of Connection
<iq type='result' from='target@example.org/bar' to='initiator@example.com/foo' id='initiate'> <query xmlns='http://jabber.org/protocol/bytestreams' sid='vxf9n471bn46'> <streamhost-used jid='streamhostproxy.example.net'/> </query> </iq>
Example 19. Initiator Requests Activation of Bytestream
<iq type='set' from='initiator@example.com/foo' to='streamhostproxy.example.net' id='activate'> <query xmlns='http://jabber.org/protocol/bytestreams' sid='vxf9n471bn46'> <activate>target@example.org/bar</activate> </query> </iq>
Example 20. Proxy Informs Initiator of Activation
<iq type='result' from='streamhostproxy.example.net' to='initiator@example.com/foo' id='activate'/>
Referències:
- Apunts per fer el podcast: fitxer .txt amb la llista de coses que volia comentar al podcast és una barreja de català, castellà i anglès.
- RFC i XEPs:
- RFC1928: SOCKS Protocol v5
- XEP-0065: SOCKS5 Bytestream
- XEP-0030: Service Discovery
- Extencions del XMPP: tots els XEPs
from=’initiator@example.com/foo’
to=’target@example.org/bar’
id=’hello’>
<query xmlns=’http://jabber.org/protocol/disco#info’/>
</iq>
Podcast 2×01: introudcció i descripció detallada del protcol SOCKS5
Reading time: 3 – 4 minutes
Després de moltes hores de feina estudiant el protocol SOCKS he decidit publicar un podcast que expliqui el seu RFC, el podcast pretent fer una introducció des de la part meś conceptual fins endinsar-se en el fluxe de paquets, els camps de les peticions llençades arribant a explicacions de nivell de bit. Amb l’ajuda dels diagrames adjunts a aquest article, l’RFC1928 i l’explicació del podcast després hauriem d’estar capacitats per implementar un client/servidor SOCKS5.
El podcast:
[display_podcast]
Esquemes que ajuden a seguir el podcast
esquema 1: petició d’un client SOCKS5 al servidor
+----+----------+----------+ |VER | NMETHODS | METHODS | +----+----------+----------+ | 1 | 1 | 1 to 255 | +----+----------+----------+
esquema 2: resposta del servidor SOCKS5 al client
+----+--------+ |VER | METHOD | +----+--------+ | 1 | 1 | +----+--------+
mètodes d’autenticació
- X’00’ NO AUTHENTICATION REQUIRED
- X’01’ GSSAPI
- X’02’ USERNAME/PASSWORD
- X’03’ to X’7F’ IANA ASSIGNED
- X’80’ to X’FE’ RESERVED FOR PRIVATE METHODS
- X’FF’ NO ACCEPTABLE METHODS
esquema 3: el client SOCKS5 envia una comanda al servidor
+----+-----+-------+------+----------+----------+ |VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT | +----+-----+-------+------+----------+----------+ | 1 | 1 | X'00' | 1 | Variable | 2 | +----+-----+-------+------+----------+----------+
camp: ATYP -> address type
- IP V4 address: X’01’
- DOMAINNAME: X’03’
- IP V6 address: X’04’
esquema 4: resposta del servidor SOCKS5 a la comanda del client
+----+-----+-------+------+----------+----------+ |VER | REP | RSV | ATYP | BND.ADDR | BND.PORT | +----+-----+-------+------+----------+----------+ | 1 | 1 | X'00' | 1 | Variable | 2 | +----+-----+-------+------+----------+----------+
camp: REP -> reply
- X’00’ succeeded
- X’01’ general SOCKS server failure
- X’02’ connection not allowed by ruleset
- X’03’ Network unreachable
- X’04’ Host unreachable
- X’05’ Connection refused
- X’06’ TTL expired
- X’07’ Command not supported
- X’08’ Address type not supported
- X’09’ to X’FF’ unassigned
esquema 5: encapsulaments per enviaments de paquets UDP
+-----+----+-----+------------------------+------+ | ... | IP | UDP | SOCKS5 UDP ASSOCIATION | DATA | +-----+----+-----+------------------------+------+
esquema 6: camps de l’encapsulament: UDP ASSOCIATION
+----+------+------+----------+----------+----------+ |RSV | FRAG | ATYP | DST.ADDR | DST.PORT | DATA | +----+------+------+----------+----------+----------+ | 2 | 1 | 1 | Variable | 2 | Variable | +----+------+------+----------+----------+----------+
Referències d’utilitat
- Apunts per fer el podcast: fitxer .txt amb la llista de coses que havia de comentar al podcast és una barreja de català, castellà i anglès… però pot servir-vos per entendre el que intento explicar
- Wikipedia: SOCKS
- RFC’s:
podcast 1×13: desafio networking [la solución]
Reading time: < 1 minute A pesar de que la solución se alcanzó y aplico durante los meses de agosto y septiembre, hasta hoy no he podido grabar la solución en este podcast. Espero que haya sabido explicarla bien y que quede claro como se ha hecho para solucionar el problema, sinó preguntad.
podcast 1×12: mail-gateway (GatV2)
Reading time: 2 – 4 minutes
GatV2 es un servidor de correo para hacer smart-relay o para que se entienda mejor el concepto para usar como frontend del servidor de correo de la empresa o del ISP (backend). GatV2 nos filtra todo el correo UCE y nos ofrece una herramienta de gestión del SPAM.
El siguiente esquema ofrece una idea de donde estaría el GatV2:
A través del podcast podreis seguir cual es el proceso que sigue un correo para pasar através del GatV2. Obviamente no es sencillo entender a la primera todo lo que hace pero a través de este gráfico (pinchar encima para zoom), de la explicación y de la documentación de la web del proyecto espero que podais comprender mejor el proceso.
Para ver las capturas de pantalla a las que se habla durante el podcast pasarós por la documentación del proyeco GatV2.
Finalmente el podcast:
[display_podcast]
El podcast dur alrededor de 1h, así pues Jorge me ha ayudado a hacer una tabla de contenidos del mismo así pues, podeis ir directamente al minuto que os interesa del podcast gracias a la siguiente información:
- Presentación: 0-1m44s
- Historia: 1m44s – 3m
- En que consiste: 3m – 8m15s
- Los componentes: 8m15s – 24m20s
- Como funciona: 24m20s – 42m49s
- WebUI del DSPAM: 42m49 – 55m55s
- Despedida y cierre: 55m55s – 56m56s
En los próximos dias publicaremos (Jorge y yo) el podcast dividido en pequeños MP3 en l página del proyecto GatV2 para mayor comodidad de los interesados en el proyecto.
podcast 1×11: desafio networking [el problema]
Reading time: < 1 minute Hablando sobre el problema del articulo sobre el desafio de networking. También aprovecho para enlazar una buena referencia sobre como comprender los problemas de secuencias TCP:
Espero haberme explicado bien y haber podido describir el problema algo mejor que en el articulo anterior, ya que no es sencillo describir un problema tan inusual.
[display_podcast]
podcast 1×10: La solució als problemes de Twitter
Reading time: 1 – 2 minutes
Aquest podcast és un experiment entre el Pau Freixes i jo mateix parlant sobre com es podria solucionar els grans problemes de disponibilitat de twitter. Fa molt de temps que dono voltes en com es podria solucionar tota la problemàtica de twitter via un backend de jabber i xmpp. Aquest esquema descriu una mica la idea que s’explica al blog:
[display_podcast]
NOTA: a partir d’ara ja no posaré més música de fons als podcast i intentaré no fer gens o quasi gens de post-producció al que gravo. Ja que ni se’m dona bé ni tinc ganes d’invertir el temps en fer coses qu no m’aporten ni em motiven. Crec que el que intento transmetre ja queda clar.