Tengo cinco sistemas Linux CentOS 6 en el trabajo, y encontré un problema bastante extraño que solo parece ocurrir con mi ID de usuario en todos los sistemas Linux que tengo ... Este es un ejemplo del problema de las entradas que exceptué del last
comando ... .
mpenning pts/19 Fri Nov 16 10:32 - 10:35 (00:03)
mpenning pts/17 Fri Nov 16 10:21 - 10:42 (00:21)
bill pts/15 sol-bill.local Fri Nov 16 10:19 - 10:36 (00:16)
mpenning pts/1 192.0.2.91 Fri Nov 16 10:17 - 10:49 (12+00:31)
kkim14 pts/14 192.0.2.225 Thu Nov 15 18:02 - 15:17 (4+21:15)
gduarte pts/10 192.0.2.135 Thu Nov 15 12:33 - 08:10 (11+19:36)
gduarte pts/9 192.0.2.135 Thu Nov 15 12:31 - 08:10 (11+19:38)
kkim14 pts/0 :0.0 Thu Nov 15 12:27 - 15:17 (5+02:49)
gduarte pts/6 192.0.2.135 Thu Nov 15 11:44 - 08:10 (11+20:25)
kkim14 pts/13 192.0.2.225 Thu Nov 15 09:56 - 15:17 (5+05:20)
kkim14 pts/12 192.0.2.225 Thu Nov 15 08:28 - 15:17 (5+06:49)
kkim14 pts/11 192.0.2.225 Thu Nov 15 08:26 - 15:17 (5+06:50)
dspencer pts/8 192.0.2.130 Wed Nov 14 18:24 still logged in
mpenning pts/18 alpha-console-1. Mon Nov 12 14:41 - 14:46 (00:04)
Puede ver dos de mis entradas de inicio de sesión de pts que no tienen una dirección IP de origen asociada a ellas. Mis máquinas CentOS tienen hasta otros seis usuarios que comparten los sistemas. Aproximadamente el 10% de mis inicios de sesión ven este problema, pero ningún otro nombre de usuario exhibe este comportamiento . No hay entrada /var/log/secure
para las entradas sin una dirección IP de origen.
Preguntas
Dado el tipo de scripts que mantengo en estos sistemas (que controlan gran parte de nuestra infraestructura de red), estoy un poco asustado por esto y me gustaría entender qué ocasionaría que mis inicios de sesión ocasionalmente pierdan las direcciones de origen.
- ¿Por qué se
last -i
muestra0.0.0.0
para las entradas de línea de pts (también vea esta respuesta ) - ¿Hay algo (que no sea actividad maliciosa) que explique razonablemente el comportamiento?
- Además de la marca de tiempo del historial de bash, ¿hay otras cosas que pueda hacer para rastrear el problema?
Informativo
Desde que esto comenzó a suceder, habilité la bash
marca de tiempo del historial (es decir, HISTTIMEFORMAT="%y-%m-%d %T "
en .bash_profile
) y también agregué algunos otros trucos del historial de bash ; sin embargo, eso no da pistas sobre lo que sucedió durante los sucesos anteriores.
Todos los sistemas ejecutan CentOS 6.3 ...
[mpenning@typo ~]$ uname -a
Linux typo.local 2.6.32-279.9.1.el6.x86_64 #1 SMP Tue Sep 25 21:43:11 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
[mpenning@typo ~]$
EDITAR
Si lo uso last -i mpenning
, veo entradas como esta ...
mpenning pts/19 0.0.0.0 Fri Nov 16 10:32 - 10:35 (00:03)
mpenning pts/17 0.0.0.0 Fri Nov 16 10:21 - 10:42 (00:21)
Nota para aquellos que intentan responder: no he iniciado sesión con el screen
comando o la GUI . Todos mis inicios de sesión son de SSH; Para recibir el premio de recompensa, debe citar referencias autorizadas para explicar las last -i
0.0.0.0
entradas obtenidas solo a través de SSH.
EDITAR 2 (para las preguntas de ewwhite)
/etc/resolv.conf
(tenga en cuenta que utilicé .local
addrs en la last
salida anterior para ocultar la información de mi empresa)
[mpenning@sasmars network]$ cat /etc/resolv.conf
nameserver 192.0.2.40
nameserver 192.0.2.60
domain mycompany.com
search mycompany.com
[mpenning@sasmars network]$
/etc/hosts
información (tenga en cuenta que este archivo de hosts personalizado solo existe en una de las máquinas que tiene estos problemas)
[mpenning@sasmars network]$ cat /etc/hosts
127.0.0.1 localhost.localdomain localhost
192.0.2.44 sasmars.mycompany.com sasmars
::1 localhost6.localdomain6 localhost6
## Temporary kludge until I add reverse hostname mappings...
## Firewalls
192.0.2.254 a2-inet-fw1
192.0.2.253 a2-inet-fw2
192.0.2.254 a2-wan-fw1
192.0.2.253 a2-wan-fw2
192.0.2.201 a2-fab-fw1
192.0.2.202 a2-fab-fw2
192.0.2.203 t1-eds-fw1
192.0.2.42 sasvpn
192.0.2.246 sasasa1
192.0.2.10 sasoutfw1
## Wireless
192.0.2.6 saswcs1
192.0.2.2 l2wlc3
192.0.2.4 l2wlc4
192.0.2.12 f2wlc5
192.0.2.16 f2wlc6
192.0.2.14 f2wlc1
192.0.2.8 f2wlc2
[mpenning@sasmars network]$
sftp
Salida desde /var/log/secure
*
Dec 26 10:36:37 sasmars sshd[26016]: pam_sm_authenticate: called (pam_tacplus v1.3.7)
Dec 26 10:36:37 sasmars sshd[26016]: pam_sm_authenticate: user [mpenning] obtained
Dec 26 10:36:37 sasmars sshd[26016]: tacacs_get_password: called
Dec 26 10:36:37 sasmars sshd[26016]: tacacs_get_password: obtained password
Dec 26 10:36:37 sasmars sshd[26016]: pam_sm_authenticate: password obtained
Dec 26 10:36:37 sasmars sshd[26016]: pam_sm_authenticate: tty [ssh] obtained
Dec 26 10:36:37 sasmars sshd[26016]: pam_sm_authenticate: rhost [192.0.2.91] obtained
Dec 26 10:36:37 sasmars sshd[26016]: pam_sm_authenticate: trying srv 0
Dec 26 10:36:38 sasmars sshd[26016]: Accepted password for mpenning from 192.0.2.91 port 55118 ssh2
Dec 26 10:36:38 sasmars sshd[26016]: pam_sm_setcred: called (pam_tacplus v1.3.7)
Dec 26 10:36:38 sasmars sshd[26016]: pam_unix(sshd:session): session opened for user mpenning by (uid=0)
Dec 26 10:36:38 sasmars sshd[26018]: pam_sm_setcred: called (pam_tacplus v1.3.7)
Dec 26 10:36:38 sasmars sshd[26018]: subsystem request for sftp
Dec 26 10:37:20 sasmars sshd[26016]: pam_unix(sshd:session): session closed for user mpenning
Dec 26 10:37:20 sasmars sshd[26016]: pam_sm_setcred: called (pam_tacplus v1.3.7)
last -i mpenning
muestra los espacios en blanco?Respuestas:
script
diferencias de comportamiento entre RedHat y DebianBibliotecas vinculadas
CentOS 6.3 - script (util-linux-ng 2.17.2)
Ubuntu 12.04 - script (util-linux 2.20.1)
PTY
Base en código fuente ascendente ,
script
de ambas versiones abren nueva pty. Siguiente es prueba.Ubuntu 12.04
Ubuntu 12.04
script
abrió un nuevo pts (2). Simplemente no se actualizó/var/log/wtmp
.CentOS 6
Me estoy saltando la prueba porque ya sabemos que
script
abrir pty y registrarse con wtmplibutemper
Entonces, la principal diferencia parece ser la biblioteca adicional (
libutempter.so.0
) centradascript
con CentOS .Prueba con Ubuntu 12.04
Compilando
script
con libutempterPruebas
Antes de correr
script
Dentro
script
Despues del
script
finalLa causa raíz del nombre de host emtpy
Y sí,
script.c
cree lawtmp
entrada con el nombre de host vacío. Mire el siguiente bloque de código en lautil-linux-2.20.1/term-utils/script.c
línea: 245-247Basado en
libutempter-1.1.5/utempter.h
Entonces, en
script.c
realidad está pasando un nombre de host vacíoutempter_add_record
.RedHat Backport
Lo interesante es que upstream en
util-linux-ng-2.17.2
realidad no es compatiblelibutempter
. Parece que Redhat decidió agregar ese respaldo nuevamente.El comando anterior devuelve un resultado vacío.
Conclusión
Entonces, la diferencia de comportamiento entre las dos distribuciones no es un error, sino una elección. RedHat decidió admitir esa característica, mientras que Debian la omitió.
fuente
coreutils
versión rpm que usa CentOS 5? Tengo que verificar el código fuente.libutempter
no está vinculado en EL4 (víaldd
), pero está vinculado en elscript
comando EL5 y EL6 . Es probable que este cambio de características haya sido implementado para sistemas similares a Red Hat desde la introducción en 2007 de RHEL 5.coreutils
en EL4 es la versión 5.2.1. En EL5 es la versión 5.97.script
está en util-linux.Esto me parece absolutamente desconcertante. O bien, debe usar algún nombre DNS o dirección IP. También revisé el
last.c
archivo pero todavía no puedo encontrar por qué no muestra nada. Probablemente con algo de tiempo, puedo calcular la parte sobre 0.0.0.0.Las dos variables globales utilizadas en el contexto son estas.
Entonces, en teoría, debería usar dns o IP.
Veré si puedo cavar algo más. Pero lo que ewwhite hizo son preguntas válidas.
fuente
Así que corrí por última vez en un depurador que con suerte le dará al menos algunas respuestas a su pregunta. Sin embargo, mi sentimiento es que la causa raíz es más profunda.
¿Por qué last -i muestra 0.0.0.0 para entradas de línea pts
La mejor manera de explicar esto es lo que sucede cuando no pasa -i.
La razón de esto está en esta sección de código de
last.c
Ambos
usedns
yuseip
(usando las opciones predeterminadas) no están marcados. Esto hace que la lógica se copie fuera de la estructurap->ut_host
que, segúnman utmp
contiene, el nombre de inicio de sesión remoto según lo registrado por lo que haya escrito en elutmp
.En su caso, el valor aquí es ceros. Es por eso que cuando ejecutas
last
nada aparece para ti.En el caso de
last -i
entonces se invoca dns_lookup. Esto pasará la entrada (p-> ut_addr_v6) que se resolverá a través de DNS. En su caso, este valor también contiene ceros.La mayor parte
dns_lookup
es escaparatismo y heusteric. Básicamente lo que importa es la funcióngetnameinfo
. Esta es una llamada a la biblioteca que en este caso hará todo lo posible para resolver el valor binario almacenado enut_addr_v6
. Cuando esta entrada contiene ceros (como en su caso), en realidad está resolviendo esto0.0.0.0
como es lo que sucede con sulast -i
salida.¿Hay algo (que no sea actividad maliciosa) que explique razonablemente el comportamiento?
Bueno, probablemente sea un error o descuido. Su poco probable que sea dañino, ya que parece estúpida dejar ningún rastro como atacante en lugar de omitir una dirección de origen.
El foco de las respuestas hasta ahora ha sido buscar el lugar equivocado.
last
solo leeutmp
owtmp
. Sin embargo,last
está haciendo todo lo posible con los datos que tiene.¡Su causa raíz se encuentra en algún lugar de la manera en que
utmp
se está escribiendo !Si bien algunas aplicaciones escriben directamente
utmp
, supongo que la fuente de sus problemas radica en elsshd
manejo de la administración de la sesión.Además de la marca de tiempo del historial de bash, ¿hay otras cosas que pueda hacer para rastrear el problema?
utmp
normalmente no se puede escribir y no está destinado a serlo.utmp
está escrito por aplicaciones diseñadas para iniciar sesión y configurar su sesión. En tu caso eso essshd
.Por qué sshd no maneja a su usuario correctamente es muy extraño, ya que debería estar copiando correctamente el nombre de host del que vino. Aquí es donde los esfuerzos de depuración probablemente deberían centrarse. Comience agregando la salida de depuración de sshd a sus registros y vea si surge algo anómalo.
Si desea solucionar el problema (o tal vez incluso descubrir más sobre el problema) puede usarlo
pam_lastlog
para administrarutmp
agregándolo a la entrada de la sesión en /etc/pam.d/sshd.De hecho, no está de más comprobar si ya está allí, porque
pam_lastlog
contiene unanohost
opción que definitivamente explicaría su comportamiento.Finalmente, no podrías usar el último en absoluto.
aulast
hace el mismo trabajo a través del subsistema de auditoría.Puede valer la pena intentar ver si eso ha logrado al menos escribir la dirección correcta. Si no es así, su problema debe ser sshd, ya que sshd está pasando los nombres DNS a diferentes subsistemas como utmp o audit.
fuente
pam_lastlog
como se mencionó anteriormente?(1) Base en
last
salida OPDespués de iniciar sesión a través de ssh, se puede enviar ssh a localhost y obtener 0.0.0.0
last -i
para más adelante.Base en las primeras cuatro líneas del registro de OP
pts/19
iniciar sesión fue dentro delpts/17
período de inicio de sesión.pts/17
iniciar sesión fue dentro delpts/1
período de inicio de sesión.Para esta ocurrencia específica, es lógico adivinar que OP ssh desde 192.0.2.91 (
pty/1
), luego dentro de esa sesión ssh, inicie sesión localmente (ssh localhost
) en el servidor nuevamente (pts/17
) y nuevamente (pts/19
).Verifique si esta superposición ocurre con otra ocurrencia.
Lo siguiente puede ayudar a señalar la causa
(2) Secnario adicional
Escenario 1 - sudo y terminal
xhost + localhost
su - UserB
osudo su - UserB
luego abra una nueva terminal (xterm, gnome-terminal, etc.)UserB
se mostrará como 0.0.0.0 enlast -i
su - UserB
no se registrará comoUserB
inicio de sesión en último lugar, pero abrir un terminal lo hará.Escenario 2 - inicio de sesión
sudo login
last
ylast -i
last
no mostrar nombre de host o IP para ellogin session
.last -i
IP 0.0.0.0 para ellogin session
.La respuesta de Mife ya muestra el bloque de código de
last.c
. La razón paralast
mostrar el nombre de host / IP vacío es porqueut_host
esos registros están realmente vacíos. Para una estructura wtmp completa, hazloman wtmp
en cualquier sistema Linux.Los 2 escenarios aquí muestran que incluso los paquetes estándar, bajo cierta situación, los crean como tales.
(3) Bash History Hack
Solo funcionará si la sesión se usa
bash
como shell interactivo..bashrc
y.bash_profile
solo son utilizados porbash
.No se obtendrán automáticamente si la sesión usa cualquier otro shell (sh, csh, etc.) o ejecuta el programa directamente, y tampoco habrá historial de bash.
(4) Contabilidad de procesos
Dado que OP no menciona nada sobre el
secure
archivo, asumiré que es un callejón sin salida y que en realidad proporciona una pista.Si la siguiente suposición es correcta
auth.log (debian) / secure (CentOS) no ayudará. Como solo se registra en él la acción relacionada con la autenticación.
wtmp / utmp, con la limitación en su estructura de datos, también es un callejón sin salida. No hay información sobre lo que los creó.
Eso nos deja con una opción, la contabilidad de procesos . Esta es una gran arma y debe usarse con precaución.
La versión del paquete psacct debe ser 6.3.2-56 o superior, de acuerdo con esta publicación .
Si se va a utilizar esto y
/var/log
tiene un espacio limitado, cambie el archivo de registro de acct a un directorio (acceso solo raíz) debajo/home
, que generalmente tiene mucho más espacio.Esta es realmente la gran arma. Con una tasa de incidencia de OP del 10%, debería haber un resultado dentro de una semana. Si durante ese período, la entrada vacía aparece
last
pero nada en el registro de cuentas, se convierte en una situación misteriosa y requeriría una acción drástica .A continuación se muestra una salida de muestra de
lastcomm
También puede usar 'dump-acct' para mostrar más información.
PS1: intenté abrir algunas sesiones de terminal y ssh. No está claro (o no es fácil de señalar) qué abrirá un nuevo pts. Sin embargo, muestra todo lo que se ejecutó dentro de esa sesión / pts.
PS2: Una publicación de blog sobre el uso de la actuación de un Mike.
fuente
ssh localhost
y verifiquelast -i
.login locally
, me refiero a hacerssh localhost
dentro de esa sesión ssh. Modifiqué esa oración, espero que ahora sea menos confusa.Cuando inicia sesión en una máquina, estas podrían ser pocas entradas en el último comando.
La primera entrada con tty * aparece cuando inicia sesión a través del terminal o la consola presionando CTRL + ALT + F1-6. Está bastante claro desde el terminal que está usando.
La segunda entrada normalmente aparece en la imagen cuando inicia sesión en una máquina y abre una ventana de terminal en la GUI. También habrá una entrada incluso si abre una nueva pestaña en la misma ventana de terminal.
El tercer tipo de entrada se produce cuando abre una sesión de pantalla después de iniciar sesión a través de SSH. Eso también creará una entrada allí y sin ninguna dirección IP.
La cuarta entrada es bastante normal, que todos entienden.
Si lo hace
last -i
con las siguientes entradas, verá algo como esto:Estoy bastante seguro de que su caso entra en cualquiera de los 2 casos, uno con la ventana de terminal en la GUI y el otro con la sesión de pantalla.
Espero que esto ayude.
fuente
screen
ninguna de las0.0.0.0
entradas. Solo uso la GUI cuando instalé las máquinas (alrededor de agosto / septiembre). Veo muchas0.0.0.0
entradas de pts después de ese tiempo.No creo que lleguemos lejos con esto sin depurar last.c, pero eso no debería ser demasiado difícil ya que se compila fácilmente ...
Sin embargo, una posibilidad es volcar el archivo / var / log / wtmp usando el comando utmpdump y echar un vistazo a los registros en bruto, esto puede arrojar algo de luz para usted. Si no es así, publique alguna salida relevante de
para que podamos recrear copias locales de su wtmp para depurar con
fuente
Verifiqué en 12 servidores de aplicaciones multiusuario CentOS y RHEL 6.3. Ninguno exhibió este comportamiento. No hubo entradas faltantes en la
last
producción que se remontan a las 4-5 semanas.Creo que sería importante ver su
/etc/hosts
entrada de archivo para asegurarse de que se ajusta a este formato .Además, ¿qué estás haciendo para la resolución DNS? ¿Puedes publicar tu
/etc/resolv.conf
?Las otras respuestas que indican que
0.0.0.0
representa conexiones locales son correctas. Los ejemplos típicos son los eventos de reinicio y de inicio de sesión de la consola:Dado que esto solo parece ocurrir con usuarios nombrados, ¿hay algún cambio? ¿Hay algo funky que se obtiene o ejecuta en sus scripts de inicio de sesión? ¿Has cambiado
~/.bashrc
o~/.bash_profile
por defecto? ¿Hay otros scripts de inicio de sesión especiales en el entorno?--Editar--
Todavía no puedo reproducir esto de ninguna manera. Sin embargo, miro dos componentes críticos. El
last
comando es estable y no se ha cambiado en mucho tiempo. Mirando el registro de cambios de sysvinit-tools , no hay errores relevantes. Lo mismo para initscripts (wtmp).Si puede forzar que esto suceda, pruébelo con una cuenta de usuario diferente de las mismas máquinas de origen. Pero no veo ninguna indicación de que este sea un problema del sistema operativo.
fuente
/etc/hosts
) deberían afectar a todos ... no solo yolast -if
ambos archivos y ver si ves los mismos resultados con el tiempo?/var/log/secure
... las entradas que0.0.0.0
muestran no muestran nada en/var/log/secure
RESOLUCION FINAL
Ya otorgué el bono, así que esto es solo para futuros googlers con la misma pregunta.
La razón por la que esto solo aparece en ~ 10% de mis inicios de sesión es porque cuando hago cambios importantes en nuestros enrutadores o conmutadores, lo uso
script foo.log
para tener un registro completo del cambio del terminal. Por razones que todavía no entiendo, CentOS crea unapts
entrada cuando usa elscript
comando ... Demostraré el resultado delast -i
antes y después de ejecutarscript
...Este comportamiento parece ser exclusivo de CentOS 6 ... tenemos algunas máquinas CentOS 4.7 en el laboratorio que no ponen una entrada en blanco en
wtmp
... Las máquinas Debian / Gentoo tampoco exhiben este comportamiento. Nuestros administradores de Linux se están rascando la cabeza por qué CentOS agregaría intencionalmente otrapts
entrada cuando ejecutasscript
... Sospecho que este es un error RHEL.EDITAR : presenté este problema como ID de error RHEL 892134
NOTA
Algunas personas han asumido erróneamente que puse
script
mi~/.bashrc
o~/.bash_profile
. Este es un argumento defectuoso ... si eso fuera cierto, miwtmp
debería tener una0.0.0.0
entrada después de cada uno de mis inicios de sesión ssh ...Por supuesto, ese no fue el caso ...
fuente
script
comando en su pregunta inicial.script
programa hace un mecanografiado de todo lo impreso en su terminal. Es un detalle pertinente..bashrc
o.bash_profile
no; Ejecutoscript foo.log
cuando hago cambios importantes para poder tener un registro de cambios ... es decir, por eso solo afecta al ~ 10% de mis inicios de sesión 2) Si su acusación es correcta (y no lo es), nunca tendría un inicio de sesión ssh que no tenía otra0.0.0.0
entrada justo después 3)script
solo lo hace en CentOS ... Lo he usado durante más de una década y nunca vi este comportamiento en otra distribución ... en este punto, estoy argumentando que es probable que sea un CentOS errorscript
solo bifurcaré un shell. En base a lo que está mostrando aquí, la versión CentOS / Redhat descript
realmente bifurca primero. Aunque un poco decepcionado (: P) de que no es algo más genérico / a través de la distribución, al menos el misterio ha desaparecido de mi mente. PD: Me sorprende que tengas a Gentoo en producción @. @Las conexiones Pseudo Terminal Slave (pts) son conexiones SSH o telnet que significan conexiones indirectas al sistema. Todas estas conexiones pueden conectarse a un shell que le permitirá emitir comandos a la computadora. Entonces, cuando abre un terminal en su sistema desde la interfaz gráfica de usuario, se abre un pts con source ip 0.0.0.0. Según la información proporcionada por usted, parece que sucede debido a la secuencia de comandos que se ejecuta en este servidor o está programada, que utiliza el servicio ssh o telnet o los puntos locales para lanzar la salida en la terminal.
fuente
¿Qué cliente ssh usas? Algunos clientes ssh pueden multiplexar múltiples terminales a través de una conexión y noto que todas sus sesiones sin IP caen dentro de sesiones más largas que tienen una IP registrada.
No puedo duplicar este comportamiento con ssh aquí.
fuente
Tal vez su dirección IP se resuelva en una cadena en blanco en uno de sus servidores DNS, probablemente la secundaria si ocurre solo el 10% del tiempo (o simplemente un archivo de host si se distribuye desde un repositorio central). Eso explicaría la entrada faltante (o espacio en blanco) y sería coherente con la lectura de Soham de la fuente.
fuente
"0.0.0.0" significa que es un usuario local (no un inicio de sesión remoto), probablemente invocado por la aplicación, por ejemplo, cronjob.
fuente
# last -i |grep 0.0.0.0 \ reboot system boot 0.0.0.0 Wed Dec 5 20:09 - 17:18 (15+21:08) # last |grep reboot \ reboot system boot 2.6.32-10-pve Wed Dec 5 20:09 - 17:18 (15+21:08)
Ocurre porque usa el sistema local y 0.0.0.0 significa la dirección IP de todas las interfaces. Si cree que tal vez alguien hackeado, intente configurar el registro completo del shell, incluidos los comandos a través de ssh: http://blog.pointsoftware.ch/index.php/howto-bash-audit-command-logger/
fuente
Lo resolví agregando un script a ~ / .bashrc, el script encuentra la última dirección IP de origen de la conexión Telnet, luego puede agregar el IP a un archivo de registro o hacer lo que necesite ...
Sharon
fuente
netstat -nae | grep 23
No es una forma útil de encontrar conexiones telnet. Este comando da 92 resultados en mi sistema, ninguno de ellos es telnet.