The Belgian midfielder struck on the hour mark to give Cagliari a second consecutive victory under new coaches Ivo Pulga and Diego Lopez.
The IS Arena still had limited capacity due to security concerns, but the win sees the Sardinians leapfrog Bologna in the standings.
Alberto Gilardino thought he had opened the scoring on 12 minutes. His header came off the inside of the post and bounced on the line into Michael Agazzi's arms. The whole of the ball didn't cross the line and the linesman kept his flag down the whole time. To Bologna's chagrin it was the right call. The fact Agazzi didn't panic and just waited for the ball also played into the decision.
It took 20 minutes for Cagliari to fashion their first chance. A timid Nainggolan shot from distance was easily gathered by Federico Agliardi.
A Nene ricochet almost found its way in, as his knee met a Gyorgy Garics clearance, but Agliardi did well to dive and catch it.
The first half was a condensed midfield battle with plenty of fouls. Five minutes before the break, Alessandro Diamanti swung a dangerous set piece wide when no-one could make a connection inside the box.
On the stroke of half time, Daniele Dessena fed Ibarbo who ran through on goal. Agliardi committed himself and went to ground, but Mikael Antonsson forced Ibarbo wide and stayed on his feet to snuff out the chance.
Just short of the hour mark, Daniele Conti swept a dangerous ball over the bar. Conti demanded a corner from the referee for a deflection, but got no dice.
Cagliari scored against the run of play after an hour. Albin Ekdal pinched the ball from Saphir Sliti Taider in midfield and drove forward. Antonsson made a challenge and the ball fell to Nainggolan who stepped inside the box to smash the ball past Agliardi into the top corner.
Bologna tried to press forward. Gilardino got goal side of Lorenzo Ariaudo in the box, but couldn't get a touch on a pinpoint cross. Substitute Manolo Gabbiadini saw a header cleared by Danilo Avelar, then deflected a shot wide.
Agazzi made an angled stop when Diamanti tried his luck from near the corner flag.
Six minutes before the end, Sau rolled the ball into the box to Joaquin Larrivey. A last ditch challenge by Garics prevented a certain second goal.
In stoppage time, substitute Thiago Ribeiro wanted too many touches before pulling the trigger and the Bologna defence were able to put a block in.
Cagliari: Agazzi, Pisano, Ariaudo, Astori, Avelar, Conti, Dessena, Ekdal, Nainggolan, (Ribeiro 85) Ibarbo, (Larrivey 77) Nene (Sau 68)
Bologna: Agliardi, Garics, Antonsson, Cherubin, Morleo, (Abero 76) Pazienza, Kone, (Pulzetti 81) Guarente, (Gabbiadini 63) Taider, Diaminti, Gilardino
Goal: Nainggolan 61 (C)